如何使xargs对给定的每一行输入执行一次命令?
它的默认行为是将行分块并执行一次命令,将多行传递给每个实例。
从http://en.wikipedia.org/wiki/Xargs:
查找/path -type f -print0 | xargs -0 rm
在本例中,find为xargs的输入提供一长串文件名。然后Xargs将这个列表拆分为子列表,并对每个子列表调用rm一次。这比功能等效的版本更有效:
查找/path -type f -exec rm '{}' \;
我知道那个发现有"执行"的标志。我只是从另一种资源中引用了一个说明性的例子。
如何使xargs对给定的每一行输入执行一次命令?
- l1是一个简单的解决方案,但如果任何文件中包含空格,它就不起作用。这是find的-print0参数的一个关键函数,用'\0'字符而不是空格分隔参数。这里有一个例子:
echo "file with space.txt" | xargs -L 1 ls
ls: file: No such file or directory
ls: with: No such file or directory
ls: space.txt: No such file or directory
更好的解决方案是使用tr将换行符转换为空(\0)字符,然后使用xargs -0参数。这里有一个例子:
echo "file with space.txt" | tr '\n' '\0' | xargs -0 ls
file with space.txt
如果你需要限制调用的次数,你可以使用-n 1参数为每个输入对程序进行一次调用:
echo "file with space.txt" | tr '\n' '\0' | xargs -0 -n 1 ls
这还允许您在将换行符转换为空之前过滤find的输出。
find . -name \*.xml | grep -v /target/ | tr '\n' '\0' | xargs -0 tar -cf xml.tar