0

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

我写 :

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

如果没有这样的文件以aliencoders.xx开头,它会说没有这样的文件或目录......

我怎么能绕过这个错误。我必须为几个这样的目录运行它,它应该只为那些存在这样的文件模式的目录提供输出,否则没有警告并且不做 xargs 等东西。

目前,如果没有这样的文件,那么它正在寻找当前目录而不是 /home/jassi

4

2 回答 2

2

如果您不想xargs在输入为空的情况下执行,您可以使用手册-r--no-run-if-empty指出的 GNU 扩展。因此,如果您有这种支持,您可以尝试 或者您可以使用option with在这些行上实现这一点 希望这会有所帮助!
find /home/jassi/ -name "aliencoders.[0-9]+" | xargs -r ls -lrt | awk '{print $9}'
execfind
find /home/jassi/ -name "aliencoders.[0-9]+" -exec ls -lrt {} + | awk '{print $9}'

于 2012-06-18T17:37:10.343 回答
1

重击

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

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

随着2>&1您将错误消息从 重定向stderrstdout。一旦你有了这个单一的输出流,你就可以用你的管道等来处理它。

如果没有此重定向,您的错误消息stderr将继续发送到控制台,从而在输出中造成混乱,并且只会stdout被管道处理。

关于重定向的所有内容将为您提供有关重定向的更多详细信息和控制。

更新

tcsh

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

command |& ...

所以

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

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

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

awk '{print $9}'

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

于 2012-06-18T17:32:53.823 回答