以下命令将不会生效:
find . -name "*.txt" | ls -l
原因:因为从管道接收的是数据流,不是参数。也就是说,find
命令的输出不能被ls
解释为路径。
正确做法:
find . -name "*.c" | xargs ls -l {}
最后的{}
可以不要。
或:
ls -l `find . -name "*.c"`
或:
find . -name "*.c" -exec ls -l {} \;
命令最后的\;
,;
是结束标志,\
是为了转义这个结束标志。
xargs
和find -exec
的区别
xargs
是分批处理,-exec
则是将find
的结果集一次性投入到缓冲区执行。
比如以上命令:如果find
找到的结果集很大,那么-exec
的缓冲区则可能一次性被填满。但是xargs
则不然,管道将结果集分批放入缓冲区执行。
另外,xargs
默认以空格为分隔符,比如find
查找结果中的文件名含有空格的情况下,xargs
将其视为两个文件,比如a b.txt
,xargs
认为这是a
文件和b.txt
。
解决方法:
find . -name "*.c" -print0 | xargs -0 ls -l {}
解释:print0
将find
结果集改用'\0'
分割,而不是默认的'\n'
。