我有一个数据库服务器,它的基本工作是导入一些特定文件,进行一些计算并在Web界面中提供数据。
计划在下周进行硬件更换,它需要迁移数据库。但是它有一个问题:实际数据库已损坏并在Web界面中显示一些错误。这是由于服务器在导入/计算时冻结,这就是替换的原因。
所以我不愿意只是转储数据库并在新服务器中恢复。仍然使用损坏的数据库没有意义,而转储旧服务器的速度非常慢。我有一个要导入的所有文件的备份(当前数字是551),我正在编写一个脚本来“重新导入”所有这些文件并再次拥有一个不错的数据库。
实际服务器需要大约20分钟才能导入每个新文件。假设新服务器由于其功能而每个文件需要10个...这是很长一段时间!这就出现了问题:它每小时收到一个新文件,因此在完成工作时会有更多文件。
恢复脚本的开头如下:
for a in $(ls $BACKUP_DIR | grep part_of_filename); do
问题是:这个“ls”来的时候会有新的文件名吗?文件名是基于时间戳的,因此它们将位于列表的末尾。
或者这个“ls”是执行一次而结果是否为temp var?
感谢。
答案 0 :(得分:-1)
ls
将在开头执行一次,并且不会显示任何新文件。
您可以重写该语句,以便在每个循环开始时再次列出文件(正如Trey所提到的,最好使用find
,而不是ls
):
while all=$(find $BACKUP_DIR/* -type f | grep part_of_filename); do
for a in $all; do
但这有一个主要问题:它将反复处理相同的文件。
脚本需要记录完成的文件。然后它可以再次列出目录并处理任何(仅限)新文件。这是一种方式:
touch ~/done.list
cd $BACKUP_DIR
# loop while f=first file not in done list:
# find list the files; more portable and safer than ls in pipes and scripts
# fgrep -v -f ~/done.list pass through only files not in the done list
# head -n1 pass through only the first one
# grep . control the loop (true iff there is something)
while f=`find * -type f | fgrep -v -f ~/done.list | head -n1 | grep .`; do
<process file $f>
echo "$f" >> ~/done.list
done