我的机器上有大量照片,我想解析为每个文件创建的标准命名约定,然后将其传递给touch
命令。
例如,我有这些文件:
2016-08-06-00h28m34.jpg
2016-08-06-00h28m35.jpg
2016-08-06-00h28m36.jpg
我想生成(然后运行)以下命令:
touch -t 201608060028.34 2016-08-06-00h28m34.jpg
touch -t 201608060028.35 2016-08-06-00h28m35.jpg
touch -t 201608060028.36 2016-08-06-00h28m36.jpg
我可以在文本编辑器中手动执行此操作,但由于每个目录中的文件数量,这非常耗时。我也可以在C#中执行它并在我的局域网上运行它,但这看起来有点矫枉过正。哎呀,我甚至可以在SQL Server中这样做,但是......它是OS X,我确信有一个简单的命令行,我不知道。
我查看了Windows version of Unix touch command to modify a file's modification date from filename part和Split Filename Up to Define Variables,但我似乎无法弄清楚如何添加脚本的秒部分的时间段,而且我不想要将批处理脚本添加到我拥有的数百个文件夹中。
非常感谢任何帮助。
答案 0 :(得分:0)
简单选项
我认为您正在尝试将文件系统时间设置为与数千张照片的EXIF捕获时间相匹配。有一个工具,它可以在OSX,Linux上运行(如果必须,还可以运行Windows)。它被称为jhead
,我使用homebrew
将其安装在OSX上:
brew install jhead
可能还有其他方法可以安装它 - jhead website。
请在尝试之前进行备份,或者在文件的一小部分上进行试用,因为我可能误解了您的需求!
基本上,设置文件系统时间戳以匹配单个文件上的EXIF时间戳的命令是:
jhead -ft SomeFile.jpg
因此,如果您想为$HOME/photos/tmp
和所有子目录中的所有文件设置时间戳,您可以这样做:
find $HOME/photos/tmp -iname \*.jpg -exec jhead -ft {} \;
选项不需要任何额外的软件
如果失败了,您可以使用默认安装在OSX上的 Perl 来执行此操作:
find . -name \*.jpg | perl -lne 'my $a=$_; s/.*(\d{4})-(\d+)-(\d+)-(\d+)h(\d+)m(\d+).*/$1$2$3$4$5.$6/ && print "touch -t $_\ \"$a\"" '
在我的机器上提供这种输出:
touch -t 201608060028.34 "./2016-08-06-00h28m34.jpg"
touch -t 201608060028.35 "./2016-08-06-00h28m35.jpg"
touch -t 201501060028.35 "./tmp/2015-01-06-00h28m35.jpg"
如果您的计算机看起来不错,可以将这些命令发送到bash
以执行此操作:
find . -name \*.jpg | perl -lne 'my $a=$_;s/.*(\d{4})-(\d+)-(\d+)-(\d+)h(\d+)m(\d+).*/$1$2$3$4$5.$6/ && print "touch -t $_\ \"$a\"" ' | bash -x
而且,对于那里的Perl纯粹主义者,是的,我知道Perl可以执行touch
本身并保存每个文件调用一个完整的touch
进程,但这需要模块和解释以及堆其他无关的东西,对于一次性或偶尔的操作来说并不是必需的。