簡體   English   中英

Bash腳本,用於使用find命令在目錄中遞歸搜索外部文件中定義的文件(文件類型)

[英]Bash script for searching of files (file types) which are defined in the external file recursively in directory using find command

我想在目錄結構中遞歸搜索特定文件類型的文件。 但是我需要從外部文件傳遞文件類型。 輸出應該是列表,其中每一行都是文件的絕對路徑。 我將使用輸出進行進一步處理。 例如,外部文件的文件類型列表如下所示(filter.lst):

*.properties

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

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

腳本中的Echo命令僅用於測試目的。 我運行了腳本:

./searchfiles.sh test_scripting filter.lst

find命令的回顯輸出為空。 為什么? 我嘗試通過以下方式更改腳本,以測試命令是否正確構建以及文件* .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

如果我手動復制“查找test_scripting -type f -name * .properties”並將其粘貼到外殼中,則可以正確找到文件:

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

為什么“查找”命令不能正確處理變量?

奇怪行為的原因是輸入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

有關刪除隱藏字符的更多信息,請參見該線程

注意:最好的方法是在空目錄中運行腳本。 如果在運行腳本的目錄中有名稱為example.properties的文件,則“ echo $ line”(執行為echo * .properties)將僅顯示.properties文件列表-在這種情況下,僅顯示文件example.properties。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM