【问题标题】:Regarding the use of xargs in find command关于在 find 命令中使用 xargs
【发布时间】:2012-06-19 02:14:13
【问题描述】:

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

我写了:

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

如果没有以aliencoders.xx开头的此类文件,则表示没有此类文件或目录...

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

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

【问题讨论】:

  • 您使用的是哪个外壳?重击? tcsh?
  • 还有..你想要awk '{print $9}'不?
  • 我正在使用 tcsh,我需要按排序顺序获取所有此类文件,因此 xargs ls -lRt 然后我只需要打印最后一列,即文件名和完整路径,因此使用 awk 进行管道处理
  • 如果所有目录都在 /home/jassi 而不是更深的级别,您可以通过for i in "/home/jassi/aliencoders.[0-9]+" ; do ls -lrt $i | awk '{print $9} ; done 交换find
  • 不,它也有更深的层次,我认为要么我必须使用带有 xargs 的 find 命令或使用正则表达式的 File::Find 模块

标签: linux find xargs tcsh


【解决方案1】:

如果您不想在输入为空的情况下执行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}'
希望这会有所帮助!

【讨论】:

  • 实际上, find /home/jassi/ -name "aliencoders.[0-9]+" 命令也在从当前目录中获取所有内容。所以我把它改成了 find /home/jassi/ -type f -name "aliencoders.[0-9]+" 然后它工作正常,否则它会给出不寻常的结果。 xargs 中的 -r 选项似乎不起作用。我在 tcsh shell 中。我会再次更新。
【解决方案2】:

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}'

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

【讨论】:

  • 谢谢大家。它实际上解决了这个问题。我将 -r 与 xargs 一起使用,这似乎比 exec 命令更有效,并且只是在 find 命令中添加了 type -f 。它按照我们的想法工作。再次感谢
猜你喜欢
  • 2016-03-15
  • 1970-01-01
  • 2018-12-11
  • 1970-01-01
  • 2014-08-03
  • 2017-11-15
  • 2010-10-25
  • 2017-04-03
  • 1970-01-01
相关资源
最近更新 更多