我不明白这到底xargs
是什么意思,这就是为什么我很惊讶为什么这两个返回不同的结果:
find ~/Downloads -iname *btsync* | ls -al
find ~/Downloads -iname *btsync* | xargs ls -al
为什么第一个没有返回我想要的内容?相反,它打印显示当前目录中的所有文件。
答案1
并非所有程序都接受输入。该ls
命令可以将目录或文件作为争论(例如ls /etc
),但您不能通过管道(|
)将其传递给它。因此,第一个命令与执行以下命令相同:
$ find ~/Downloads -iname *btsync*
$ ls -al
管道被忽略,因为ls
无法从标准输入读取。xargs
另一方面,它做了一些完全不同的事情。它读取标准输入,然后在输入的每一行上运行您给它的命令。来自man xargs
:
This manual page documents the GNU version of xargs. xargs reads items from the standard input, delimited by blanks (which can be protected with double or single quotes or a backslash) or newlines, and executes the command (default is /bin/echo) one or more times with any initial- arguments followed by items read from standard input. Blank lines on the standard input are ignored.
因此,xargs
将获取命令的每个结果find
并运行ls
它,这正是您想要的。