关于在find命令中使用xargs

时间:2012-06-18 17:20:49

标签: linux find xargs tcsh

我有一个场景,我需要选择所有具有aliencoders.numeric-digits的文件 像alienoders.1206 和find命令也应该搜索所有子目录。如果没有这样的文件,它就不应该做任何事情。

我写道:

find /home/jassi/ -name "aliencoders.[0-9]+" | xargs ls -lrt | awk print '$9'
如果没有这样的文件以aliencoders.xx开始......

,它会说没有这样的文件或目录

如何通过传递此错误。我必须为几个这样的目录运行它,它应该为这些目录提供输出,只有这样的文件模式存在,否则没有警告,也不做xargs等东西。

目前,如果没有这样的文件,则它将当前目录t find而不是/ home / jassi

2 个答案:

答案 0 :(得分:2)

如果您不想在输入为空时执行xargs,则可以使用-r--no-run-if-empty,这些是man页面中指出的GNU扩展名。所以,如果你有这种支持,你可以试试 find /home/jassi/ -name "aliencoders.[0-9]+" | xargs -r ls -lrt | awk '{print $9}'
或者,您可以使用exec选项和find来实现这些内容 find /home/jassi/ -name "aliencoders.[0-9]+" -exec ls -lrt {} + | awk '{print $9}'
希望这有帮助!

答案 1 :(得分:1)

<强>的bash

尝试此命令(在bash shell下,因为大多数人都使用它,并且没有指定shell):

find /home/jassi/ -name "aliencoders.[0-9]+" 2>&1 | xargs ls -lrt | awk '{print $9}'

使用2>&1,您将错误消息从stderr重定向到stdout。获得此单个输出流后,您可以使用管道等处理它。

如果没有此重定向,您向stderr的错误消息将继续转到控制台,在输出中创建混乱,并且管道仅处理stdout

All about redirection会为您提供有关重定向的更多详细信息和控制权。

<强>更新

<强> tcsh的

基于tcsh的使用(有时我认为我是唯一使用它的人),可以使用以下构造将stderr重定向到stdout

command |& ...

所以

find /home/jassi/ -name "aliencoders.[0-9]+" |& xargs ls -lrt | awk '{print $9}'

应该有所帮助。在您的错误消息绕过管道并直接进入控制台之前,管道只处理stdout。有了这个所有输出通过管道,你可以过滤掉你想要的。

另外,请注意在命令末尾使用awk命令:

awk '{print $9}'

与您最初发布的内容不同。