如何将同一命令应用于 Bash 中的文件列表?

How to apply the same command to a list of files in Bash?

我的意思是一些命令替换。过去我可以在 Bash 中使用反引号,例如我必须逐行下载已经收集在文本文件中的文件/链接列表:

wget `cat list.txt`

甚至从 mega 下载 megadl:

megadl `cat list.txt`

不幸的是,由于某种原因,它现在无法正常工作。我得到的整个文件列表是一长串由空格而不是换行符分隔的文本。

我经常编写只能处理一个参数的小脚本,该参数是一个文件,但不能处理列在文本文件中的文件列表。当然我不想修改我的脚本,因为 Bash 提供了这个辅助机制,将相同的命令应用于文件列表,例如 "ls -1 *.jpg" 的输出。我有一个名为 "cgamma" 的小实用程序,它对图像文件应用伽玛校正,同时保持色彩饱和度(它只是调用 imagemagick 的 mogrify)。我想在许多图像文件上使用它,像这样:

cgamma `ls -1 *.jpg` 1.3

我知道我可以使用 for loop one-liner,但它需要更多的输入:

for $i in $(ls -1 *.jpg);do cgamma $i 1.3;done

所以我的问题是,如何正确使用反引号、命令替换来处理文件列表,并对所有文件列表应用相同的命令?

您可以使用 xargs:

printf '%s[=10=]' *.jpg | xargs -0 -I {} cgamma '{}' 1.3

您实际上可以通过使用 bash 为您进行 globbing 来缩短假定的 for 循环 - 而不是解析 ls 的输出,这是最好避免的:

for i in *.jpg; do cgamma "$i" 1.3; done

这实际上比您接受的解决方案更短:-)

此外,您可以使用 GNU Parallel,不仅可以缩短命令,还可以让它们全部进行伽玛校正 并行 并利用所有这些可爱的东西您花高价购买的英特尔内核 ;-)

parallel cgamma {} 1.3 ::: *.jpg