【问题标题】:Linux: Redirecting output of a command to "find"Linux:将命令的输出重定向到“查找”
【发布时间】:2013-02-20 03:10:35
【问题描述】:

我有一个文件名列表作为某个命令的输出。 我需要在给定目录中找到这些文件中的每一个。

我尝试了以下命令:

ls -R /home/ABC/testDir/ | grep "\.java" | xargs find /home/ABC/someAnotherDir -iname

但它给了我以下错误:

find: paths must precede expression: XYZ.java

正确的做法是什么?

【问题讨论】:

    标签: linux shell


    【解决方案1】:
    ls -R /home/ABC/testDir/ | grep -F .java | 
        while read f; do find . -iname "$(basename $f)"; done
    

    您也可以使用${f##*/} 代替基本名称。或者;

    find /home/ABC/testDir -iname '*.java*' | 
     while read f; do find . -iname "${f##*/}"; done
    

    请注意,毫无疑问,许多人会反对解析 ls 的输出或 find 不使用空字节作为文件名分隔符,声称文件名中的空格会导致问题。这些人通常会忽略文件名中的换行符,他们的反对意见可以被安全地忽略。 (只要您的文件名中不允许有空格,就是这样!)

    更好的选择是:

    find /home/ABC/testDir -iname '*.java' -exec find . -iname {}
    

    xargs 不起作用的原因是您不能在 find 中将 2 个参数传递给 -iname。

    【讨论】:

    • 谢谢。这解决了我的问题。是否有任何原因 xargs 和管道重定向无法与 find 一起使用?
    • 您可以使用 xargs 的 -p 标志来弄清楚:它以交互模式运行 xargs,打印即将执行的每个命令。这里的问题是 xargs 生成了一个 single find 命令,并附加了 all 文件名。在这种情况下,您只需要 --max-args 选项,即可为列表中的每个文件名启动 1 个 find 命令:ls -R /home/ABC/testDir/ | grep "\.java" | xargs --max-args=1 find /home/ABC/someAnotherDir -iname
    【解决方案2】:

    找到 /home/ABC/testDir -name "\.java"

    【讨论】:

    • 这将列出 testDir 中的 .java 文件。我想在当前目录中找到 testDir 中存在的所有 .java 文件。也许我不够清楚。让我编辑示例。
    猜你喜欢
    • 1970-01-01
    • 2019-07-19
    • 1970-01-01
    • 2018-10-15
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-07
    相关资源
    最近更新 更多