OSX:在文件夹中执行相同的命令来处理所有文件。

11
我正在使用一个名为TMX(https://github.com/tonybeltramelli/TMXResolutionTool)的命令行工具。我想在特定文件夹中对每个.png文件执行此命令。我该怎么做呢?
下面是该工具的使用方法:
TMXResolutionTool <tmx path> <resize ratio>
TMXResolutionTool <image path> <resize ratio>
TMXResolutionTool <image path> <new width> <new height>

干杯。

2个回答

24

我认为一个 for/do 循环比 find 加上 xargs 可能更清晰,也可能稍微快一点。假设您正在使用 OS X 上的默认 shell,bash,如果您想将其作为单行命令执行,则命令的一般形式为:

for f in <files>; do <somecommand> $f; done

其中<files>是一个表达式,其评估为文件列表(通常是通配符扩展),<somecommand>是您希望为每个文件执行的命令行,而$f则依次展开为<files>中的每个文件。因此,您可以输入类似以下内容的命令:

for f in myfolder/*; do TMXResolutionTool $f <otherparameters> ; done

您还可以在同一行上使用分号将多个命令链接在循环中运行。因此,如果您的问题意味着您想对每个文件按顺序运行三次TMXResolutionTool并具有不同参数:

for f in myfolder/*; do TMXResolutionTool $f <otherparameters>; TMXResolutionTool $f <differentparameters>; TMXResolutionTool $f <yetmoredifferentstuff>; done

顺便提一下,这些都是基本的bash shell技巧,不仅适用于OS X。任何一本关于bash的书都会告诉你这些以及更多内容(尽管如果你想从Mac的角度学习命令行,我推荐O'Reilly的Learning Unix for OS X Mountain Lion这本书)。


1
注意,如果您想在当前文件夹中运行命令,请使用 *(例如 for f in *)。 - shim

9
find <path> -name "*.png" | xargs -Irepl TMXResolutionTool repl <ratio>

如果您需要按顺序在每个文件上运行所有这些命令,编写一个小的bash脚本可能更加清晰易懂。
find <path> -name "*.png" | while read f ; do 
TMXResolutionTool $f <resize ratio> ; 
TMXResolutionTool $f <resize ratio> ;
TMXResolutionTool $f <new width> <new height> ; done

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接