使用它们时列出文件 - Shell Linux

时间:2016-09-12 16:22:36

标签: linux bash shell sh

我有一个数据库服务器,它的基本工作是导入一些特定文件,进行一些计算并在Web界面中提供数据。

计划在下周进行硬件更换,它需要迁移数据库。但是它有一个问题:实际数据库已损坏并在Web界面中显示一些错误。这是由于服务器在导入/计算时冻结,这就是替换的原因。

所以我不愿意只是转储数据库并在新服务器中恢复。仍然使用损坏的数据库没有意义,而转储旧服务器的速度非常慢。我有一个要导入的所有文件的备份(当前数字是551),我正在编写一个脚本来“重新导入”所有这些文件并再次拥有一个不错的数据库。

实际服务器需要大约20分钟才能导入每个新文件。假设新服务器由于其功能而每个文件需要10个...这是很长一段时间!这就出现了问题:它每小时收到一个新文件,因此在完成工作时会有更多文件。

恢复脚本的开头如下:

for a in $(ls $BACKUP_DIR | grep part_of_filename); do

问题是:这个“ls”来的时候会有新的文件名吗?文件名是基于时间戳的,因此它们将位于列表的末尾。

或者这个“ls”是执行一次而结果是否为temp var?

感谢。

1 个答案:

答案 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