如何将管道输入定向到 ls 命令?

Las*_*all 27 command-line bash ls pipe

当我输入以下内容时:

find . -name *foo* | ls -lah
Run Code Online (Sandbox Code Playgroud)

它返回与普通ls命令相同的结果,就好像它没有输入一样。

然而:

ls -lah $( find . -name *foo* )
Run Code Online (Sandbox Code Playgroud)

效果很好,但只有当find命令有结果时。

是否可以通过管道传输ls

Pri*_*ley 35

您可以-execfind命令一起使用。

find . -name '*foo*' -exec ls -lah {} \;
Run Code Online (Sandbox Code Playgroud)

  • 一个稍微好一点的方法:`find 。-name '*foo*' -exec ls -lah {} +` (7认同)
  • 我试图找出为什么添加“+”更好。`man less` 并搜索 `-exec command {} +` 找到了它。在命令末尾添加“+”,在执行命令之前附加多个参数。运行的命令少得多。 (2认同)

小智 23

find . -name *foo* | xargs -r ls -lah
Run Code Online (Sandbox Code Playgroud)

那应该工作。

  • @Lasall 首选的方法是使用 find 的 `-exec +`(或 `-exec \;`)。`xargs` 只与 `-0` 选项一起使用是安全的,这意味着你必须告诉你通过管道传输到 `xargs` 的任何命令来用 NULL 字节 (\0) 分隔项目。使用 `find` 你可以使用 `-print0` 来做到这一点。xargs 的 -0 和 find 的 -print0 不是标准的,但 -exec 是,所以如果可移植性是一个问题,请使用 find 和 -exec。 (3认同)

小智 8

尝试这个:

find  . -name *.bak -ls
Run Code Online (Sandbox Code Playgroud)


Pet*_*Kay 7

这适用于带有空格或异常字符的文件名,并且ls可以对所有文件进行排序:

find . -name *foo* -print0 | xargs -0 ls -lah
Run Code Online (Sandbox Code Playgroud)

-print0意味着诸如此类的文件file foo 1名将获得输出,find后跟空值。“-0”参数xargs告诉它期待这种输入,因此带空格的文件名可以ls正确地通过管道传输到命令。

xargs工程是在某些方面优于find etc -exec ls {} +因为所有的文件名送送ls一次,所以如果你想通过时间戳对它们进行排序的所有(使用ls),像这样的作品:

find . -iname *pdf -print0 | xargs -0 ls -ltr
Run Code Online (Sandbox Code Playgroud)

在 NetBSD 系统上,“-printx”也是一个选项(这对我来说似乎是一个有用的论点,但无论如何,我们有 xargs -0 并且没关系):

find . -name *foo* -printx | xargs ls -lah` # not for Ubuntu
Run Code Online (Sandbox Code Playgroud)