2017-09-12 17 views
0

テキストファイルから1行ずつ読み込んで、対象のフォルダ内のファイルを再帰的に探したいと思っています。見つかった場合は、そのファイルを別のディレクトリにコピーします。以下のスクリプトは実行されますが、端末からsh script.shを実行すると、検索またはコピーは実行されません。エラーは表示されず、$line可変文字列が各ループ反復に対して正しくエコーされます。 $list変数の代わりに実際のファイル名を使用して端末から同じを実行すると、タスクは正常に完了します。シェルスクリプトtxtファイルからの検索とコピー

スクリプト:ファイル名の

script.sh 
#!/bin/bash 
file="filenames.txt" 
while IFS= read line 
do 
find /Volumes/share/all-files-location -name "$line" -print -exec cp {} /Volumes/share/found-files-location \; 
done < "$file" 

リスト、プレーンテキスト:

A1037_MG_1262.jpg 
A1037_MG_12621.jpg 
A1037_MG_1263.jpg 
[11,000 more entries] 

思考?

+1

これは私のマシンで正常に動作しているようですが、ブートドライブに実際に存在するものにパスとファイル名を調整しています。すべてのパスが正しいと確信していますか? –

+0

また、問題のファイルへのパスにはスペースやその他の特殊文字が含まれていますか? –

+0

コピーするファイルに空白がありません。 "〜/デスクトップ/テストフォルダ/すべてのWebの写真を検索する"という名前のスクリプトを$ line "-print -exec cp {}〜/ Desktop/test-folder/found \;"どちらも問題なく動作しません。ターミナルウィンドウで変数ではなくファイル名を指定してfindコマンドを実行すると、パスが正しく実行され、パスが正しいことがわかります。 – Brett

答えて

0

入力ファイルがCRLFであったため、Unixは一般にLFを行末として使用していたため、bashスクリプトはLF文字の出現順で行をソートしていたため、各ファイル名の末尾に\rそれ。あなたのディスクにはおそらく\rを含むファイル名が含まれていなかったので、findツールはファイルを見つけられなかったため、エラーメッセージが表示されずにツールが失敗したようです。

解決方法:ファイルの改行形式をLFに切り替えます。

関連する問題