当前位置: 首页>>技术问答>>正文


我如何更改文件的修改/创建日期?

, ,

问题描述

有没有办法改变文件被修改/创建的日期(在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” =是此目录中所有文件的所需日期。

See my webpage

第三种解决方法

最简单的方式 – 访问和修改将是相同的:

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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/241.html,未经允许,请勿转载。