我一直在研究如何验证文件系统 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
文件索引工作正常,大约需要两个小时来索引约 3000 万个文件。
B 面是我们遇到问题的地方。我编写了一个非常简单的 shell 脚本,它读取索引文件,测试文件是否存在,然后计算有多少文件,但是在循环遍历索引文件名上的 3000 万行时内存不足. 通过while循环有效地执行下面的这一点代码,并为找到和未找到的文件增加计数器。
if [ -f "$TYPE" "$FILENAME" ] ; then
print file found
++
else
file not found
++
fi
我的问题是:
- shell 脚本可以从如此大的列表中执行这种类型的报告吗?尝试执行此脚本时,64 位 unix 系统内存不足。我已经考虑将输入脚本分成更小的块以使其更快。目前可以
- 如果 as shell 脚本不合适,你会建议什么?