私は、ファイル システム A にあった数百万のファイルが実際にファイル システム B に移動されたことを確認する方法に取り組んできました。移動されました。ファイルは当初、ログを提供する rsync を介して移動されましたが、監査を行うのに役立つ形式ではありませんでした。そこで、システム A 上のすべてのファイルにインデックスを付けるために、次のスクリプトを作成しました。
#!/bin/bash
# Get directories and file list to be used to verify proper file moves have worked successfully.
LOGDATE=`/usr/bin/date +%Y-%m-%d`
FILE_LIST_OUT=/mounts/A_files_$LOGDATE.txt
MOUNT_POINTS="/mounts/AA mounts/AB"
touch $FILE_LIST_OUT
echo TYPE,USER,GROUP,BYTES,OCTAL,OCTETS,FILE_NAME > $FILE_LIST_OUT
for directory in $MOUNT_POINTS; do
# format: type,user,group,bytes,octal,octets,file_name
gfind $directory -mount -printf "%y","%u","%g","%s","%m","%p\n" >> $FILE_LIST_OUT
done
ファイルのインデックス作成は正常に機能し、約 3,000 万個のファイルのインデックス作成に約 2 時間かかります。
サイド B で問題が発生します。インデックス ファイルを読み取り、ファイルがそこにあるかどうかをテストし、そこにあるファイルの数をカウントする非常に単純なシェル スクリプトを作成しましたが、インデックス付きファイル名の 3,000 万行をループしている間にメモリが不足しています。 . while ループを介して以下のこの小さなコードを効果的に実行し、ファイルが見つかった場合と見つからなかった場合にカウンターをインクリメントします。
if [ -f "$TYPE" "$FILENAME" ] ; then
print file found
++
else
file not found
++
fi
私の質問は次のとおりです。
- シェル スクリプトは、このような大きなリストからこの種のレポートを作成できますか。このスクリプトを実行しようとしたときに、64 ビットの UNIX システムでメモリが不足しました。より高速にするために、入力スクリプトを小さなチャンクに分割することを既に検討しました。現在、できる
- シェルスクリプトが不適切である場合、何を提案しますか?