#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
的副作用。#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
–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
评论
要提到所有文件都在同一文件夹中的更简单的情况:例如,触摸-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