私はLinuxを使用していて、数百万のファイルを含むディレクトリ(SOURCE_DIR)から数千のファイルを検索しようとしています。検索する必要があるファイル名のリストがあり、1つのテキストファイル(FILE_LIST)に保存されています。このファイルの各行には、SOURCE_DIR内のファイルに対応する単一の名前が含まれており、ファイルには数千行あります。
## FILE_LIST contain single Word file names, each per line
#Name0001
#Name0002
#..
#Name9999
ファイルを別のディレクトリ(DESTINATION_DIR)にコピーしたい。以下のループを作成しました。ループを1つずつ見つけるためのループが内部にあります。
#!/bin/bash
FILE_LIST='file.list'
## FILE_LIST contain single Word file names, each per line
#Name0001
#Name0002
#..
#Name9999
SOURCE_DIR='/path/to/source/files' # Contain millions of files in sub-directories
DESTINATION_DIR='/path/to/destination/files' # Files will be copied to here
while read FILE_NAME
do
echo $FILE_NAME
for FILE_NAME_WITH_PATH in `find SOURCE_DIR -maxdepth 3 -name "$FILE_NAME*" -type f -exec readlink -f {} \;`;
do
echo $FILE
cp -pv $FILE_NAME_WITH_PATH $DESTINATION_DIR;
done
done < $FILE_LIST
このループには多くの時間がかかり、私の目標を達成するためのより良い方法があるかどうか疑問に思っていました。私は検索しましたが、私の問題の解決策は見つかりませんでした。すでに存在する場合は解決策をご案内するか、上記のコードに微調整を提案してください。別のアプローチまたはpython/Perlソリューションの場合も、私は元気です。お時間をいただきありがとうございます。
locate
ではなくgrep
を使用してfind
を試してください。私はファイルインデックスdbを使用しているため、かなり高速です。 Sudo updatedb
を実行して、事前にデータベースを更新することを忘れないでください。