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


20

当我输入类似的内容时:

find . -name *foo* | ls -lah

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

然而:

ls -lah $( find . -name *foo* )

效果很好,但仅在find命令产生结果时有效。

是否可以通过管道输送到ls


您需要指定是要在每个查找结果中查找文件,还是要直接查找结果。如果是后者,则u / Dennis的答案是正确的答案。
rmutalik

Answers:


27

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

find . -name '*foo*' -exec ls -lah {} \;

谢谢您的解决方案。没有管道,但这是一种优雅的方法。如果没有找到“ find”的结果,则不显示任何内容(实际上是好的)。
2011年

7
更好的方法:find . -name '*foo*' -exec ls -lah {} +
jlliagre

20
find . -name *foo* | xargs -r ls -lah

那应该工作。


1
谢谢您的解决方案。但是我该如何处理空格?
2011年

2
@Lasall的首选方法是使用find的-exec +(或-exec \;)。xargs仅可与该-0选项一起安全使用,这意味着您必须告诉通过管道传递的任何命令xargs以NULL字节(\ 0)分隔项目。与find你可以做到这一点-print0。xargs的-0和find的-print0不是标准的,但-exec是标准的,因此,如果可移植性成为问题,则将find与-exec一起使用。
盖尔哈2011年


3

使用以下命令:(ls可以排序,可以使用带空格或不寻常字符的文件名)

find . -name *foo* -print0 | xargs -0 ls -lah

“ -print0”表示诸如的文件file foo 1名将从中获取输出,find后跟null。xargs的“ -0”参数告诉它期望这种输入,因此带有空格的文件名会ls正确地传递到命令中。

xargs在某种程度上,构造要比一次find etc -exec ls {} \;发送所有文件名更好ls,因此,如果您想按时间戳对所有文件名进行排序(使用ls),则类似以下方法:

find . -iname *pdf -print0 | xargs -0 ls -ltr

在NetBSD系统上,“-printx”也是一个选项(这对我来说似乎是一个有用的参数,但是无论如何,我们有xargs -0都可以):

find . -name *foo* -printx | xargs ls -lah (不适用于Ubuntu)


对于我来说,这确实使我成功了,因为他们能够实际使用ls的排序功能。
哈里·穆斯托-Playfair
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.