当我输入类似以下内容时:
find . -name *foo* | ls -lah
它返回的结果与普通ls
命令相同,就好像没有输入一样。
然而:
ls -lah $( find . -name *foo* )
效果很好,但只有当find
命令有结果时才有效。
是否可以通过管道传输ls
?
答案1
您可以使用-exec
命令find
。
find . -name '*foo*' -exec ls -lah {} \;
答案2
find . -name *foo* | xargs -r ls -lah
那应该可行。
答案3
尝试这个:
find . -name *.bak -ls
答案4
这适用于带有空格或不常见字符的文件名,并ls
可以对所有文件进行排序:
find . -name *foo* -print0 | xargs -0 ls -lah
-print0
表示文件名如file foo 1
将获得输出,find
后跟 null。“-0”参数xargs
告诉它期望这种输入,因此带空格的文件名可以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