Answers:
只要您是文件(或根目录)的所有者,就可以使用以下touch
命令更改文件的修改时间:
touch filename
默认情况下,这会将文件的修改时间设置为当前时间,但是有许多标志,例如-d
用于选择特定日期的标志。因此,例如,要将文件设置为在当前文件的两个小时之前被修改,可以使用以下命令:
touch -d "2 hours ago" filename
如果要相对于文件的现有修改时间来修改文件,则应采用以下方法:
touch -d "$(date -R -r filename) - 2 hours" filename
如果要修改大量文件,可以使用以下内容:
find DIRECTORY -print | while read filename; do
# do whatever you want with the file
touch -d "$(date -R -r "$filename") - 2 hours" "$filename"
done
您可以将参数更改为find
以仅选择您感兴趣的文件。如果您只想更新相对于当前时间的文件修改时间,则可以简化为:
find DIRECTORY -exec touch -d "2 hours ago" {} +
与文件时间相关的版本无法使用此格式,因为它使用外壳程序来构成。的参数touch
。
就创建时间而言,大多数Linux文件系统都不跟踪此值。有一个ctime
与文件相关联,但它跟踪,当文件元数据的最后改变。如果该文件从未更改其权限,则可能会延迟创建时间,但这只是一个巧合。显式更改文件修改时间将作为元数据更改,因此也会产生更新的副作用ctime
。
ctime
以任何标准方式都不可能更改。
ctime
元数据更改时间的信息来自POSIX。我不知道答案中的shell片段是否可以与严格的POSIX shell实用程序一起使用。但是它们肯定可以在Ubuntu上运行,这是此站点上答案的上下文。
gtouch
via brew install coreutils
。
谢谢您的帮助。这为我工作:
在终端中,转到目录进行日期编辑。然后输入:
find -print | while read filename; do
# do whatever you want with the file
touch -t 201203101513 "$filename"
done
按下Enter键后,您会看到一个“>”,最后一次显示->“ done”。
注意:您可能需要更改“ 201203101513”
“ 201203101513” =是此目录中所有文件的日期。
.ss
其中SS是秒数。(请注意:这似乎无法控制亚秒级的时间,例如纳秒或毫秒,对我而言,这些时间仅显示为零;但是,对于我的用例来说,这种差异是允许的。)
最简单的方法-访问和修改将相同:
touch -a -m -t 201512180130.09 fileName.ext
哪里:
-a = accessed
-m = modified
-t = timestamp - use [[CC]YY]MMDDhhmm[.ss] time format
如果您想使用,NOW
只需删除-t
和时间戳。
要验证它们是否相同:
stat fileName.ext
请参阅:触摸男人
touch
标志均未得出正确的结果。修改日期已调整,但更改和访问的日期实际上更改为NOW
changed
时间和modified
时间戳之间有什么区别?
Touch可以单独引用文件的日期,而无需调用date
或使用命令替换。以下是touch的信息页面:
`-r FILE' `--reference=FILE'
Use the times of the reference FILE instead of the current time.
If this option is combined with the `--date=TIME' (`-d TIME')
option, the reference FILE's time is the origin for any relative
TIMEs given, but is otherwise ignored. For example, `-r foo -d
'-5 seconds'' specifies a time stamp equal to five seconds before
the corresponding time stamp for `foo'. If FILE is a symbolic
link, the reference timestamp is taken from the target of the
symlink, unless `-h' was also in effect.
例如,要为文件的日期增加8小时(file
仅在空格等情况下使用引号引起来的文件名):
touch -r "file" -d '+8 hour' "file"
使用循环遍历当前目录中的所有文件:
for i in *; do touch -r "$i" -d '+8 hour' "$i"; done
我听说使用a *
并让for
自己选择文件名本身更安全,但使用find -print0 | xargs -0 touch ...
应该可以处理大多数疯狂的字符,例如文件名中的换行符,空格,引号,反斜杠。(PS。首先不要在文件名中使用疯狂的字符)。
例如,要查找文件thatdir
名以开头的所有文件s
,并在修改后的时间戳记中加一天,请使用:
find thatdir -name "s*" -print0 | xargs -0 -I '{}' touch -r '{}' -d '+1 day' '{}'
这个小脚本至少对我有用
#!/bin/bash
# find specific files
files=$(find . -type f -name '*.JPG')
# use newline as file separator (handle spaces in filenames)
IFS=$'\n'
for f in ${files}
do
# read file modification date using stat as seconds
# adjust date backwards (1 month) using date and print in correct format
# change file time using touch
touch -t $(date -v -1m -r $(stat -f %m "${f}") +%Y%m%d%H%M.%S) "${f}"
done
自从我编写任何类型的Unix程序以来已经有很长时间了,但是我不小心将一整年的圣诞节照片设置为错误的年份,而且我知道如果不将日期从2015年更改为2014年,那将是一个问题。 。
也许,这是一件容易的事,但是我没有找到任何简单的方法来做。
我修改了在这里找到的脚本,该脚本最初用于将日期修改一个月。
这是原始脚本:
#!/bin/bash
# find specific files
files=$(find . -type f -name '*.JPG')
# use newline as file separator (handle spaces in filenames)
IFS=$'\n'
for f in ${files}
do
# read file modification date using stat as seconds
# adjust date backwards (1 month) using date and print in correct format
# change file time using touch
touch -t $(date -v -1m -r $(stat -f %m "${f}") +%Y%m%d%H%M.%S) "${f}"
done
这是我修改后的脚本,将日期强制为“ 2014”:
#!/bin/bash
# find specific files
#files=$(find . -type f -name '*.JPG')
# use newline as file separator (handle spaces in filenames)
IFS=$'\n'
for f in $*
do
# read file modification date using stat as seconds
# adjust date backwards (1 month) using date and print in correct format
# change file time using touch
touch -t $(date -v +1y -r $(stat -f %m "${f}") +2014%m%d%H%M.%S) "${f}"
done
我现在意识到我可以做一个更通用的版本:
#!/bin/bash
# find specific files
#files=$(find . -type f -name '*.JPG')
# use newline as file separator (handle spaces in filenames)
IFS=$'\n'
for f in $*
do
# read file modification date using stat as seconds
# adjust date backwards (1 month) using date and print in correct format
# change file time using touch (+1y adds a year "-1y" subtracts a year)
# Below line subtracts a year
touch -t $(date -v -1y -r $(stat -f %m "${f}") +%Y%m%d%H%M.%S) "${f}"
# Below line adds a year
# touch -t $(date -v +1y -r $(stat -f %m "${f}") +%Y%m%d%H%M.%S) "${f}"
done
要使用此文件,您需要将其编写并
chmod +x fn
执行:
./fn files-to-change
fn =您的文件名
例
./fn *.JPG
将在您所在的目录中将日期更改为负一年。
只需更改设置中的日期和时间即可。然后保存文件,它会自动更改
touch -d "2 hours ago" /path/*.txt
。