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


233

有没有一种方法可以更改文件的修改/创建日期(Nautilus或使用ls -l命令显示)?理想情况下,我正在寻找一条命令,该命令可以将一大堆文件的日期/时间戳更改为早晚(例如+8小时或-4天等)的一定时间。

Answers:


322

只要您是文件(或根目录)的所有者,就可以使用以下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


例如,提到所有文件都在同一文件夹中时的更简单情况:touch -d "2 hours ago" /path/*.txt
enzotib

1
我还要补充一点,ctime以任何标准方式都不可能更改。
安排

这就是POSIX吗?
user1011471

1
有关ctime元数据更改时间的信息来自POSIX。我不知道答案中的shell片段是否可以与严格的POSIX shell实用程序一起使用。但是它们肯定可以在Ubuntu上运行,这是此站点上答案的上下文。
James Henstridge

1
在OSX上,您可能要使用gtouchvia brew install coreutils
Nobu

46

谢谢您的帮助。这为我工作:

在终端中,转到目录进行日期编辑。然后输入:

find -print | while read filename; do
    # do whatever you want with the file
    touch -t 201203101513 "$filename"
done

按下Enter键后,您会看到一个“>”,最后一次显示->“ done”。

注意:您可能需要更改“ 201203101513”

“ 201203101513” =是此目录中所有文件的日期。

查看我的网页


如果文件名包含空格,则无法正常工作
Angel

网页已不再,尽管已经是6年了。尽管如此,这是我一直在寻找的答案。对于那些谁想要包含秒的时间,用.ss其中SS是秒数。(请注意:这似乎无法控制亚秒级的时间,例如纳秒或毫秒,对我而言,这些时间仅显示为零;但是,对于我的用例来说,这种差异是允许的。)
Spencer D

34

最简单的方法-访问和修改将相同:

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

请参阅:触摸男人


1
我尝试使用stat进行验证,但两个touch标志均未得出正确的结果。修改日期已调整,但更改和访问的日期实际上更改为NOW
Xerus

它对我不起作用,它仅更改了“更改”时间
Revious 18'5

@Revious,Xerus changed时间和modified时间戳之间有什么区别?
约瑟夫

9

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' '{}'

2

这个小脚本至少对我有用

#!/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

2
根据图像中的元信息调整图像的日期将非常有用。可以使用ImageMagick的标识。例如'identify -verbose <image> | grep -i date','identify -format%[exif:DateTime] <image>'可能显示'2015:01:08 10:19:10'(并非所有图像都具有exif数据)。这有效(使用sed将日期转换为touch可以处理的格式):'touch -d $(identify -format%[exif:DateTime] $ f | sed -r's /:/-/; s /:/-/ ;')$
f'– gaoithe

1

自从我编写任何类型的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

将在您所在的目录中将日期更改为负一年。


1
与上述评论相同。大多数.jpg文件将在相机辅助的元数据中嵌入日期。这有效(使用sed将日期转换为touch可以处理的格式):'touch -d $(identify -format%[exif:DateTime] $ f | sed -r's /:/-/; s /:/-/ ;')$
f'– gaoithe

-6

只需更改设置中的日期和时间即可。然后保存文件,它会自动更改


3
Snej正在寻找可用于修改多个文件的批处理或命令行解决方案。更改系统时间和日期以及修改文件可能不是理想的解决方案。
fabricator4

太多了!!!
菲利普·加乔德

对于通过网络搜索将其他操作系统带到此处的用户,此答案是更改Mac OSX上文件日期的最简单方法(“ touch -d”结果为“非法选项”)。
2014年

1
@alanning:OSX具有BSD触摸功能,而不具有GNU触摸功能。使用-t。developer.apple.com/library/mac/documentation/Darwin/Reference/...
多米尼克- [R

这可能会带来无法预料的后果。在现代操作系统中,很多文件一直在后台被修改。更改日期后,许多其他文件可能会贴上错误的日期戳,并且当系统中的其他内容注意到文件比预期的要旧时,任何事情都会发生。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.