如何将同一命令应用于 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
我的意思是一些命令替换。过去我可以在 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