2013-02-20 86 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