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

伦道夫·韦斯特

我的计算机上有很多照片,我想解析为每个文件创建的标准命名约定,然后将其通过管道传递给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#来完成它,并在我的LAN上运行它,但这似乎太过分了。哎呀,我什至可以在SQL Server中执行此操作,但是...它是OS X,我确定我缺少一个简单的命令行内容。

我看过Windows版本的Unix touch命令,从filename部分修改文件的修改日期,然后将Filename拆分为Define Variables,但是我似乎无法弄清楚如何在脚本,再加上我不想将批处理脚本添加到我拥有的数百个文件夹中。

任何帮助将不胜感激。

马克·谢切尔

简单的选择

我想您正在尝试设置文件系统时间以匹配数千张照片的EXIF捕获时间。有一个用于该工具的工具,可在OSX,Linux(和Windows(必要时))上运行。它被称为jhead,我使用以下命令将其安装在OSXhomebrew上:

brew install jhead

可能还有其他安装方法-jhead网站

请先进行备份,然后再尝试对您的一小部分文件进行尝试,因为我可能误解了您的需求!

基本上,将文件系统时间戳设置为与单个文件的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每个文件的整个过程,但这需要模块和说明以及大量其他无关紧要的东西,而对于一个文件来说,这并不是真正必要的。关闭或偶尔操作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

TOP 榜单

热门标签

归档