在OS X上将文件名解析为touch命令

时间:2016-08-06 06:42:04

标签: macos terminal filenames command-line-parsing

我的机器上有大量照片,我想解析为每个文件创建的标准命名约定,然后将其传递给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 partSplit Filename Up to Define Variables,但我似乎无法弄清楚如何添加脚本的秒部分的时间段,而且我不想要将批处理脚本添加到我拥有的数百个文件夹中。

非常感谢任何帮助。

1 个答案:

答案 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进程,但这需要模块和解释以及堆其他无关的东西,对于一次性或偶尔的操作来说并不是必需的。