假设我有一些命令的输出(比如ls -1):
a
b
c
d
e
...
我想依次对每一个应用一个命令(比如echo)。如。
echo a
echo b
echo c
echo d
echo e
...
在bash中最简单的方法是什么?
假设我有一些命令的输出(比如ls -1):
a
b
c
d
e
...
我想依次对每一个应用一个命令(比如echo)。如。
echo a
echo b
echo c
echo d
echo e
...
在bash中最简单的方法是什么?
当前回答
你可以使用for循环:
for file in * ; do echo "$file" done
注意,如果所讨论的命令接受多个参数,那么使用xargs几乎总是更有效,因为它只需要生成所讨论的实用程序一次,而不是多次。
其他回答
例如,我喜欢使用gawk在一个列表上运行多个命令
ls -l | gawk '{system("/path/to/cmd.sh "$1)}'
然而,可转义字符的转义可能会有点麻烦。
你可以在每一行上使用一个基本的前置操作:
ls -1 | while read line ; do echo $line ; done
或者你可以将输出管道到sed进行更复杂的操作:
ls -1 | sed 's/^\(.*\)$/echo \1/'
你可以使用for循环:
for file in * ; do echo "$file" done
注意,如果所讨论的命令接受多个参数,那么使用xargs几乎总是更有效,因为它只需要生成所讨论的实用程序一次,而不是多次。
Xargs用反斜杠和引号失败。它需要像这样
ls -1 |tr \\n \\0 |xargs -0 -iTHIS echo "THIS is a file."
xargs -0选项:
0,零 输入项以空字符而不是空格结束,并且引号和反斜杠为 并不特别(每个角色都是字面意思)。禁用文件字符串的结束,其处理方式与 还有其他论点吗?当输入项可能包含空格、引号或反斜杠时很有用。的 GNU find -print0选项生成适合此模式的输入。
Ls -1以换行符结束项,因此tr将它们转换为空字符。
这种方法比手动迭代慢了大约50倍。(见Michael Aaron Safyans的回答)(3.55秒vs. 0.066秒)。但对于其他输入命令,如locate、find、从文件(tr \\n \\0 <file)中读取或类似的命令,您必须像这样使用xargs。
对我来说更好的结果是:
ls -1 | xargs -L1 -d "\n" CMD