为什么管道不能与“find”和“ls”一起使用

为什么管道不能与“find”和“ls”一起使用

为什么管道不能与“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*)

相关内容