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

#1 楼

只要您是文件(或根目录)的所有者,就可以使用touch命令更改文件的修改时间:

touch filename


默认情况下,将文件的修改时间设置为当前时间,但是有许多标志,例如-d标志来选择特定的日期。因此,例如,要将文件设置为在当前时间的两个小时之前被修改,可以使用以下命令:

而是使用现有的修改时间来解决问题,请执行以下操作:
touch -d "2 hours ago" filename


您可以将参数更改为find以仅选择您感兴趣的文件。如果您只想相对于当前时间更新文件修改时间,则可以简化此操作to:

touch -d "$(date -R -r filename) - 2 hours" filename


文件时间相对版本无法使用此格式,因为它使用外壳程序来构成touch的参数。 >就创建时间而言,大多数Linux文件系统都不跟踪此值。有一个与文件关联的ctime,但是它跟踪文件元数据的最新更改时间。如果文件从未更改其权限,则可能会延迟创建时间,但这是一个巧合。显式更改文件修改时间将作为元数据更改,因此也会产生更新ctime的副作用。

评论


要提到所有文件都在同一文件夹中的更简单的情况:例如,触摸-d“ 2小时前” /path/*.txt。

– Enzotib
2011年9月22日在7:05

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

–安排
2011-09-22 7:40

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

–詹姆斯·亨斯特里奇
15年9月15日在22:27

触摸:非法选项-d

–用户
16年1月15日在14:55

在OSX上,您可能要通过brew install coreutils使用gtouch。

– Nobu
16年5月23日在22:50

#2 楼

感谢您的帮助。
这对我有用:

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

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


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

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

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

请参阅我的网页

评论


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

–天使
16年8月2日在7:56

网页已不再,尽管已经是6年了。尽管如此,这是我一直在寻找的答案。对于那些想将秒数包括在内的人,请使用.ss,其中ss是秒数。 (请注意:这似乎无法控制亚秒级的时间,例如纳秒或毫秒,对我而言,这些时间只是显示为零;不过,这种差异在我的用例中是允许的。

–喷枪D
18/12/9在19:32

#3 楼

最简单的方法-访问和修改的方法是相同的:
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
请参阅:手动触摸

评论


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

– Xerus
18年3月19日在20:51

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

–上一个
18/12/5在16:42

@Revious,Xerus更改的时间和修改的时间戳之间有什么区别?

– ijoseph
19年5月26日在20:49



#4 楼

touch可以单独引用文件的日期,而无需调用date或使用命令替换。以下是来自触摸信息页面的信息:例如,为文件日期添加8小时(文件名file仅在出现空格的情况下引用,以此类推):

`-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.


对当前目录中的所有文件使用循环:

touch -r "file" -d '+8 hour' "file"


我听说使用*并让for自己选择文件名本身更安全,但使用find -print0 | xargs -0 touch ...应该可以处理大多数疯狂的字符,例如文件名中的换行符,空格,引号和反斜杠。 (PS。首先不要在文件名中使用疯狂的字符。)例如,要查找thatdir中所有文件名以s开头的文件,并在修改后的时间戳记中添加一天,使用:

for i in *; do touch -r "$i" -d '+8 hour' "$i"; done


#5 楼

这个小脚本至少对我有用

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


评论


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

–gaoithe
16年5月24日在11:30



#6 楼

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


将目录中的日期更改为负一年。你在哪里。

评论


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

–gaoithe
16年5月25日在9:49