1

特定のファイル タイプのファイルをディレクトリ構造で再帰的に検索したいと考えています。しかし、外部ファイルからファイル タイプを渡す必要があります。出力は、各行がファイルへの絶対パスであるリストである必要があります。出力をさらに処理するために使用します。ファイルタイプのリストである外部ファイルは、たとえば次のようになります (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

手動で「find 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

「検索」コマンドが変数を正しく処理しないのはなぜですか?

4

1 に答える 1

0

奇妙な動作の原因は、入力された filter.lst ファイルの隠し文字でした。filter.lst は Windows OS で作成され、Linux OS にコピーされました。したがって、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.

于 2013-03-10T13:29:55.003 に答える