2013-03-09 58 views
1

我想在目錄結構中遞歸搜索特定文件類型的文件。但我需要從外部文件傳遞文件類型。輸出應該列出,每行是文件的絕對路徑。我將使用輸出進行進一步處理。 哪裏是文件類型列表中的外部文件看起來例如像這樣(filter.lst):Bash腳本搜索在外部文件中使用find命令在目錄中遞歸定義的文件(文件類型)

*.properties 

我已經試過這(searchfiles.sh):

while read line 
do 
echo "$(find $1 -type f -name $line)" 
done < $2 

echo命令裏面該腳本僅用於測試目的。我運行腳本:

./searchfiles.sh test_scripting filter.lst 

find命令的echo輸出爲空。爲什麼?我試圖改變腳本通過以下方式來測試指令是否正確建立了文件的* .properties存在:

while read line 
do 
echo "find $1 -type f -name $line" 
echo "$(find $1 -type f -name $line)" 
done < $2 

我有輸出:

./searchfiles.sh test_scripting filter.lst 
find test_scripting -type f -name *.properties 

如果我複製manualy 「找到test_scripting型的F -name的* .properties」並粘貼到shell文件被正確地發現:

find test_scripting -type f -name *.properties 
test_scripting/dir1/audit.properties 
test_scripting/audit.properties 
test_scripting/dir2/audit.properties 

爲什麼沒有「查找」命令過程中正確的變量?

回答

0

奇怪行爲的原因是輸入filter.lst文件中的隱藏字符。 filter.lst是在Windows操作系統中創建的,然後複製到Linux操作系統。因此find命令沒有找到預期的文件。測試輸入文件是否包含隱藏字符:

od -c filter.lst 
0000000 * . p r o p e r t i e s \r \n 
0000016 

隱藏的字符是「\ r」。編輯腳本以在每行中使用sed命令刪除隱藏的字符。

while read line 
do 
echo "$(find $1 -type f -name $(echo $line | sed -e 's/\r$//'))" 
done < $2 

有關刪除隱藏字符的更多信息,請參閱此thread

注意:最好的方法是在空目錄中運行腳本。如果存在具有名稱的文件,例如運行腳本的目錄中的example.properties,「echo $ line」(作爲echo * .properties執行)將僅顯示.properties文件的列表 - 在本例中只顯示文件example.properties。

相關問題