【问题标题】:Parse filenames into touch command on OS X在 OS X 上将文件名解析为触摸命令
【发布时间】:2016-08-06 19:56:06
【问题描述】:

我的机器上有大量照片,我想解析我为每个文件创建的标准命名约定,然后将其通过管道传递给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 version of Unix touch command to modify a file's modification date from filename partSplit Filename Up to Define Variables,但我似乎无法弄清楚如何在脚本的秒部分添加句点,而且我不想添加批处理脚本到我拥有的数百个文件夹中的每一个。

我们将不胜感激。

【问题讨论】:

  • 你有点要求别人为你写一个脚本。他们为什么要这样做?顺便说一句,我会用 python 来做,因为这是我的首选语言,不仅仅是 shell 脚本,而且是跨平台的。当你说你可以在 SQL Server 中做到这一点时,你不是在说实话:)
  • 我可以在 SQL Server 中使用 xp_cmdshell 来完成,所以,是的。我也可以在 PowerShell 中执行此操作,但同样,OS X 平台错误。Mark 的答案正是我想要的。非常感谢您的反馈!
  • 但是 SQL Server 不是只能在 Windows 下运行吗?
  • 是的,SQL Server(目前)只能在 Windows 下运行。我在与我的 MacBook Pro 相同的网络上有一台 Windows 机器。您一定错过了我的问题中的“我也可以在 C# 中执行它并在我的 LAN 上运行它”这句话。没关系。马克回答了这个问题。这种题外话是没有意义的。

标签: macos terminal filenames command-line-arguments


【解决方案1】:

简单选项

我认为您正在尝试将文件系统时间设置为与数千张照片的 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 进程,但这需要模块和解释以及一堆其他无关的东西对于一次性或偶尔的操作而言,这并不是真正必要的。

【讨论】:

  • 我有很多照片是经过扫描的,所以里面根本没有 EXIF 数据。否则我可以很容易地用它来设置文件属性,正如你所建议的那样。 perl 解决方案效果很好,谢谢。我接受了你的回答。
猜你喜欢
  • 1970-01-01
  • 2016-10-26
  • 1970-01-01
  • 2014-07-05
  • 2016-03-24
  • 2015-12-03
  • 2010-10-06
  • 2020-04-13
  • 1970-01-01
相关资源
最近更新 更多