linux / shell:相对更改文件的修改时间戳?


20

我的相机会生成类似的文件,IMG_1234.JPGMVI_1234.AVI带有这些文件的时间戳。不幸的是,时间设置不正确,并且时间戳已关闭。

我想在磁盘上设置文件的时间戳。(不是EXIF数据)。

拟议算法:

1 read file's modify date
2 add delta, i.e. hhmmss (preferred: change timezone)
3 write new timestamp

是否有捷径可寻?也许可以使用纪元时间(从现在起的秒数)简化计算并生成一个shell脚本。


关键字是mtime。但是,我还没有找到解决方案,因为我需要相对于文件的mtime进行更改,而不是unixtutorial.org/2008/11/…中
索引

Answers:


38

touch 可以做到这一点:

 $ ls -l something
-rw-rw-r-- 1 tgs tgs 0 2010-03-22 16:03 something
 $ touch -r something -d '-1 day' something 
 $ ls -l something 
-rw-rw-r-- 1 tgs tgs 0 2010-03-21 16:03 something

http://linux.about.com/library/cmd/blcmdl_touch.htm

要更改mtime,请添加 --time=mtime


是的,但这是相对于您当前的系统时间,而不是文件的时间..谢谢,但是..
索引

1
第一次回答时,是的,但是我编辑了答案。使用该-r file选项时,该选项将相对于该文件。因此,如果您有时间来处理要处理的同一个文件,那么您将获得所需的内容。
rescdsk 2010年

太好了,谢谢。正是我一直在寻找的东西。
Artem Russakovskii 2011年

@rescdsk,出于好奇,此更改将如何影响文件的法医分析?如果您修改了文件,然后将其修改日期重新设置为先前的值,那么在inode或其他文件系统元数据上是否可以检测到该文件?日记会影响这一分析吗?
弗兰克·托马斯

@FrankThomas,对不起,我一无所知!
rescdsk 2014年

11

如果AM / PM错误,请结合以上内容...

更正文件时间戳记:

#!/bin/sh
for i in all/*; do
  touch -r "$i" -d '-12 hour' "$i"
done

然后将jpg文件中的EXIF信息更新为更正的时间戳:

$ jhead -dsft *.jpg

不要忘记在相机中修复时间设置。


2

遍历子目录中的所有文件:使用stat以秒为单位获取文件的epoch / unix时间,让touch将总和作为mtime的新日期进行解析并写入文件

#!/bin/sh
for i in all/*; do
  touch -m -d "$(stat -c %y "$i") + 3600 sec" "$i"
done

有关python方法的信息,请参见/programming/1158076/implement-touch-using-python


只是为了澄清,这意味着corutil的日期解析器不仅接受相对的语义时间,而且实际上可以计算!只是指出这一点,因为我在文档(gnu.org/software/coreutils/manual/…)中找不到该信息。[实际上,它存在:“相关项目向前或向后调整日期(如果没有,则为当前日期)。相关项目的影响不断累积。“]
索引

2

我在OS X中也做同样的事情,触摸的语法在这里有所不同。

我在用:

touch -r "filename" -A '013007' "filename"

相对于原始修改时间,这将调整+1小时30分钟7秒。'-013007'时光倒流。


旁注:虽然比什么都没有好,但此语法是编写脚本的噩梦。
tuomassalo

那正是我想要的(对RTFM:D太懒了)。谢谢!
米歇尔·达尔·阿加塔

1

Linux,使用touch更改最后修改的时间戳:

创建一个时间戳为现在的文件:

el@apollo:~$ touch myfile.txt
el@apollo:~$ ll myfile.txt
-rw-rw-r-- 1 el el 0 Aug 22 09:25 myfile.txt

将时间戳更改为2小时之前:

el@apollo:~$ touch -d "2 hours ago" myfile.txt
el@apollo:~$ ll myfile.txt
-rw-rw-r-- 1 el el 0 Aug 22 07:25 myfile.txt

将时间戳更改为200小时之前:

el@apollo:~$ touch -d "200 hours ago" myfile.txt
el@apollo:~$ ll myfile.txt
-rw-rw-r-- 1 el el 0 Aug 14 01:25 myfile.txt

将时间戳记更改为30天之前:

el@apollo:~$ touch -d "30 days ago" myfile.txt
el@apollo:~$ ll myfile.txt
-rw-rw-r-- 1 el el 0 Jul 23 09:25 myfile.txt
el@apollo:~$

对于恶作剧,设置将来的最后修改日期:

el@apollo:~$ touch -d "-400000 days ago" myfile.txt
el@apollo:~$ ll myfile.txt
-rw-rw-r-- 1 el el 0 Oct 21  3012 myfile.txt

显然,今晚我们要聚会3012。


对于最后一个“未来”示例,减号(-)是否告诉touch 过去可以运行40万天,而将来却无法使用?还是等一下,您是在告诉触摸日期是否为负数,负+之前=将来...?Yar
matey

0

使用jhead:

http://www.sentex.net/~mwandel/jhead/usage.html

通过h:mm向后或向前调整存储在Exif标头中的时间。当在相机上设定了错误的时间拍摄照片时,例如在穿越时区后或夏令时已更改时,此功能非常有用。


感谢您的提示,这类似于exif和exifTool,并且类似于digiKam的“调整日期和时间”功能-但我想修改文件的系统日期。另一个问题是我的智能操作系统似乎正在将时间实时转换为本地时间,并且DST已在一个时区启动:-)
索引
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.