当find | xargs ls无返回结果时,如何避免自动执行ls .命令?
规避xargs空输入时默认执行命令的问题
问题原因
你遇到的是xargs的默认行为:当xargs没有从管道接收到任何输入参数时,会直接执行后续指定的命令,不为命令传入任何参数。而ls命令在没有接收任何路径参数时,默认会列出当前工作目录的内容,因此就出现了无匹配结果却返回当前目录列表的现象。
解决方法
方法1:给xargs添加
-r(--no-run-if-empty)参数
这个是GNU xargs提供的专用参数,作用是当输入为空时,直接终止流程不执行后续命令,是最常用的解决方案,修改后命令如下:find /home/me/.config ! -user "me" -type f -print0 | xargs -0 -r ls -Al注:绝大多数Linux发行版自带的GNU版本xargs都支持该参数。
方法2:使用find自带的
-exec参数替代xargs
这种方法不需要依赖xargs的特性,兼容性更强,跨平台(BSD/macOS/Windows WSL等)都可以正常使用,find匹配不到结果时不会执行ls命令:find /home/me/.config ! -user "me" -type f -exec ls -Al {} +方法3:给ls补充兜底参数(兼容所有场景的折衷方案)
如果需要适配不支持-r参数的xargs环境,可以给ls命令增加/dev/null作为兜底参数,就算xargs没有传入任何匹配结果,ls也只会输出/dev/null的属性,不会列出当前目录内容:find /home/me/.config ! -user "me" -type f -print0 | xargs -0 ls -Al /dev/null
内容的提问来源于stack exchange,提问作者kittygirl
相关产品推荐
相关产品推荐

