複数のサブディレクトリで複数のファイルを見つける方法は?

複数のサブディレクトリで複数のファイルを見つける方法は?

複数のサブディレクトリでファイルの一覧を見つけ、各ファイルのパスを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リテラルファイル名ではなくワイルドカードパターンが必要です)。

関連情報