为什么管道不能与“find”和“ls”一起工作如果我这样做find . -name *foo* | ls -lah
,它会执行 ls$PWD
而不是 find 的输出。
但是解决方案是find . -name *foo* | xargs -r ls -alh
或者可以使用 exec。
答案1
请咨询手册页ls(1)
! 该ls
命令将其参数放在命令行不开标准输入(即文件描述符0)。
当你跑步时
<SOME_COMMAND> | ls [OPTIONS...]
你指示命令解释器创建一个管道(|
)从左侧命令的标准输出复制到右侧命令的标准输入(此处:ls
)。但ls
忽略其标准输入并检查其命令行参数,未找到位置参数并列出当前工作目录PWD
(由 Bash 等 shell 解释器存储在环境变量中)。
这xargs(1)
需要代币(如果没有特别指定,则以空格字符分隔)从其标准输入流中获取路径名,并将它们作为参数添加到要运行的另一个命令的命令行中。 在您的例子中,ls
给定的命令xargs
在其命令行上接收一组路径名,并按照手册中的说明对它们执行任务。
-ls
奖励: GNU 的“命令”选项find
将以类似的方式打印匹配的路径ls -dils
(参见find(1)
)。
答案2
另一个解决方案是使用命令替换。语法:命令 选项$(另一个命令的输出)
对于此示例:
ls -lah $(find . -name *foo*)