Macos 在OSX上将文件名解析为touch命令

Macos 在OSX上将文件名解析为touch命令,macos,terminal,filenames,command-line-arguments,Macos,Terminal,Filenames,Command Line Arguments,我的机器上有大量照片,我想解析我为每个文件创建的标准命名约定,然后将其传输到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

我的机器上有大量照片,我想解析我为每个文件创建的标准命名约定,然后将其传输到
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中执行此操作,但是。。。这是OSX,我确信我缺少一个简单的命令行

我已经看过了,还有,但是我似乎不知道如何添加脚本的秒数部分,而且我不想将批处理脚本添加到我拥有的数百个文件夹中的每一个


任何帮助都将不胜感激。

简单选项

我假定您正在尝试将文件系统时间设置为与数千张照片的EXIF捕获时间相匹配。有一个工具可以实现这一点,它运行在OSX、Linux(如果必须的话还可以运行Windows)上。它被称为
jhead
,我使用
homebrew
在OSX上安装了它,带有:

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

简单选项

我假定您正在尝试将文件系统时间设置为与数千张照片的EXIF捕获时间相匹配。有一个工具可以实现这一点,它运行在OSX、Linux(如果必须的话还可以运行Windows)上。它被称为
jhead
,我使用
homebrew
在OSX上安装了它,带有:

brew install 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
过程,但这需要模块和解释,以及一堆其他无关的东西,而这对于一次性调用来说并不是必需的,或者偶尔做手术。

你是在要求别人为你写剧本。他们为什么要这样做?顺便说一句,我会用python来做,因为这是我的入门语言,不仅仅是shell脚本,而且是跨平台的。当你说你可以在SQL Server中实现时,你并不是在说实话:)我可以用xp_cmdshell在SQL Server中实现,所以,是的。我也可以在PowerShell中这样做,但同样,OSX平台错了。Mark的答案正是我想要的。谢谢你的反馈!但是SQL Server只在Windows下运行,不是吗?是的,SQL Server(目前)只在Windows下运行。我有一台Windows计算机,它与我的MacBook Pro在同一网络上。你一定错过了我问题中的短语“我也可以用C#做,然后在我的局域网上运行”。没关系。马克回答了这个问题。这离题是没有意义的。你是在要求别人为你写剧本。他们为什么要这样做?顺便说一句,我会用python来做,因为这是我的入门语言,不仅仅是shell脚本,而且是跨平台的。当你说你可以在SQL Server中实现时,你并不是在说实话:)我可以用xp_cmdshell在SQL Server中实现,所以,是的。我也可以在PowerShell中这样做,但同样,OSX平台错了。Mark的答案正是我想要的。谢谢你的反馈!但是SQL Server只在Windows下运行,不是吗?是的,SQL Server(目前)只在Windows下运行。我有一台Windows计算机,它与我的MacBook Pro在同一网络上。你一定错过了我问题中的短语“我也可以用C#做,然后在我的局域网上运行”。没关系。马克回答了这个问题。这个离题是没有意义的。我有很多照片被扫描过,所以里面根本没有EXIF数据。否则,我可以很容易地使用它来设置文件属性,正如您所建议的那样。perl解决方案工作得非常好,谢谢。我已经接受了你的回答。我有很多照片被扫描过,所以里面根本没有EXIF数据。否则,我可以很容易地使用它来设置文件属性,正如您所建议的那样。perl解决方案工作得非常好,谢谢。我接受了你的回答。