2013-02-20 114 views
0

我有一个文件名列表作为某些命令的输出。 我需要在给定的目录中找到这些文件中的每一个。Linux:将命令的输出重定向到“查找”

我尝试下面的命令:

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

但它给我以下错误:

find: paths must precede expression: XYZ.java 

会是怎样做到这一点的正确方法?

回答

3
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 /home/ABC/testDir -iname '*.java' -exec find . -iname {} 

xargs的不工作的原因是,你不能传递2个参数找到内部。

+0

谢谢。这解决了我的问题。有没有什么原因xargs和管道重定向不适用于查找? – sachinpkale 2013-02-20 03:28:18

+1

您可以使用xargs的'-p'标志来找出它:它以交互模式运行xargs,打印它即将执行的每个命令。这里的问题在于,xargs生成了一个带所有**文件名的_single_'find'命令。在这种情况下,只需要'--max-args'选项,为列表中的每个文件名启动1​​个'find'命令:'ls -R/home/ABC/testDir/grep“\ .java”| xargs --max-args = 1 find/home/ABC/someAnotherDir -iname' – 2013-02-20 09:46:31

0

查找/主页/ ABC/-name TESTDIR “\的.java”

+0

这将列出testDir中的.java文件。我想查找当前目录中testDir中存在的所有.java文件。也许我还不够清楚。让我编辑示例。 – sachinpkale 2013-02-20 03:20:37

相关问题