複数のサブディレクトリでファイルの一覧を見つけ、各ファイルのパスをtxtファイルに保存する必要があります。リストにリストされているすべてのファイル名がありますfilenames.txt
。私はこれをしようとしています:
while read -r fname; do
find . -name "$fname" > paths.txt
done < filenames.txt
そうですか?検索するサブディレクトリ(200,000個)が多いことがわかっているにもかかわらず、予想より時間がかかるようです。もっと良い方法がありますか?ありがとう
答え1
filenames.txtの各行に対して1回、findを複数回実行しています。これがボトルネックである可能性があります。
逆のプロセスを試してみることもできます。まず、すべてのファイルを見つけて、リストのファイルと比較します。それはまるで
find * > allfiles.txt
grep -f filenames.txt allfiles.txt
答え2
次のことができます。
find . -print0 | gawk -F/ '
ARGIND == 1 {selected[$0]; next}
$NF in selected' filenames.txt RS='\0' -
つまり、find
レポートがあります。みんなgawk
ファイルですがfilenames.txt
。
これにより、find
一度だけ実行してより効率的な方法で一致させることができます。
filenames.txt
ワイルドカードパターンリストではなくリテラルファイル名のリストが含まれているとします(find
'には-name
リテラルファイル名ではなくワイルドカードパターンが必要です)。