问题描述
当我输入类似以下内容时:
find . -name *foo* | ls -lah
它返回的结果与普通的 ls
命令相同,就好像它没有输入一样。
然而:
ls -lah $( find . -name *foo* )
效果很好,但只有当 find
命令有结果时才有效。
是否可以通过管道连接到 ls
?
最佳思路
您可以将 -exec
与 find
命令一起使用。
find . -name '*foo*' -exec ls -lah {} \;
次佳思路
find . -name *foo* | xargs -r ls -lah
那应该可行。
第三种思路
尝试这个:
find . -name *.bak -ls
第四种思路
这适用于带有空格或不常见字符的文件名,并且 ls
可以对所有文件进行排序:
find . -name *foo* -print0 | xargs -0 ls -lah
-print0
表示文件名(例如 file foo 1
)将从 find
获得输出,后跟空值。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` # not for Ubuntu