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

时间:2015-07-05 06:06:34

标签: bash for-loop substitution backticks

我指的是一些命令加减。在过去,我能够在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循环单行,但更多的输入:

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

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

2 个答案:

答案 0 :(得分:3)

您可以使用xargs

printf '%s\0' *.jpg | xargs -0 -I {} cgamma '{}' 1.3

答案 1 :(得分:1)

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

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

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

此外,您可以使用GNU Parallel,不仅可以缩短命令,还可以将所有伽马校正的并行并利用您支付的所有可爱的英特尔核心美元; - )

parallel cgamma {} 1.3 ::: *.jpg