问题描述
有没有办法改变文件被修改/创建的日期(在Nautilus中或者用ls -l命令显示)?理想情况下,我正在寻找一个命令,可以将一大堆文件的日期/时间戳更早或更晚(例如+8小时或-4天等)更改为一定的时间。
最佳解决方法
您可以使用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" {} +
这种形式对于文件时间相对版本来说是不可能的,因为它使用shell来形成touch
的参数。
就创建时间而言,大多数Linux文件系统不会跟踪此值。有一个与文件关联的ctime
,但它跟踪文件元数据上次更改的时间。如果文件从未更改权限,则可能会碰巧创建时间,但这是巧合。明确更改文件修改时间将作为元数据更改进行计数,因此也会更新ctime
的副作用。
次佳解决方法
谢谢您的帮助。这对我有效:
在终端中转到date-edit的目录。然后键入:
find -print | while read filename; do
# do whatever you want with the file
touch -t 201203101513 "$filename"
done
在您输入完成后,您将看到”>”,最后一次免除 – > “done”。
注意:您可能需要更改”201203101513″
“201203101513” =是此目录中所有文件的所需日期。
第三种解决方法
最简单的方式 – 访问和修改将是相同的:
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 man
第四种方法
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
我听说使用*
并让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