假设我有一些命令的输出(例如ls -1
):
a
b
c
d
e
...
我想依次对每个命令应用一个命令(比如说echo
)。 E.g。
echo a
echo b
echo c
echo d
echo e
...
在bash中最简单的方法是什么?
答案 0 :(得分:181)
使用xargs
可能最简单。在你的情况下:
ls -1 | xargs -L1 echo
答案 1 :(得分:132)
您可以在每一行使用基本的前置操作:
ls -1 | while read line ; do echo $line ; done
或者您可以将输出传递给sed以进行更复杂的操作:
ls -1 | sed 's/^\(.*\)$/echo \1/'
答案 2 :(得分:8)
您可以使用for loop:
for file in * ; do echo "$file" done
请注意,如果有问题的命令接受多个参数,那么使用xargs几乎总是更有效率,因为它只需要生成一次有问题的实用程序而不是多次。
答案 3 :(得分:8)
你实际上可以使用sed来做它,只要它是GNU sed。
... | sed 's/match/command \0/e'
工作原理:
答案 4 :(得分:3)
for s in `cmd`; do echo $s; done
如果cmd的输出很大:
cmd | xargs -L1 echo
答案 5 :(得分:2)
xargs失败并带有反斜杠,引号。它需要像
ls -1 |tr \\n \\0 |xargs -0 -iTHIS echo "THIS is a file."
xargs -0选项:
-0, --null Input items are terminated by a null character instead of by whitespace, and the quotes and backslash are not special (every character is taken literally). Disables the end of file string, which is treated like any other argument. Useful when input items might contain white space, quote marks, or backslashes. The GNU find -print0 option produces input suitable for this mode.
ls -1
使用换行符终止项目,因此tr
会将它们转换为空字符。
这种方法比用for ...
手动迭代慢约50倍(参见 Michael Aaron Safyan 的回答)(3.55s vs. 0.066s)。但对于其他输入命令,如定位,查找,从文件(tr \\n \\0 <file
)或类似文件中读取,您必须使用xargs
这样的。{/ p>
答案 6 :(得分:1)
对我来说更好的结果:
ls -1 | xargs -L1 -d "\n" CMD
答案 7 :(得分:0)
例如,我喜欢使用gawk在列表上运行多个命令
ls -l | gawk '{system("/path/to/cmd.sh "$1)}'
但是,可转义字符的转义会有点毛茸茸。
答案 8 :(得分:0)
使用包含空格的文件名的解决方案是:
ls -1 | xargs -I %s echo %s
以下内容是等效的,但在前体和您实际想要做的事情之间有更清晰的区别:
ls -1 | xargs -I %s -- echo %s
其中 echo
是您要运行的任何内容,后面的 %s
是文件名。
感谢 Chris Jester-Young 在 answer 上的 duplicate question。