如果存在具有相同日期和时间的输出文件,shell 脚本将在 while 循环中跳过行

如果存在具有相同日期和时间的输出文件,shell 脚本将在 while 循环中跳过行

我有一个脚本,可以从具有特定日期和时间的文件创建图像。该日期和时间存储在list.txt文件中,几行具有相同的日期和不同的时间

2020 03 12 11 45
2020 03 12 10 23
2020 03 12 04 12
2020 03 12 00 23

我在 while 循环中读取了这个 TXT 文件:

while read line
do
    echo Line is... $line
    echo $line > $BIN/line.txt

    python3 $BIN/makeimage.py #creates image 
done < $BIN/list.txt

输出图像的文件名如下所示:filename_202003_1245.png.

最简单的解决方案是什么,检查文件是否已经存在,然后跳到下一行list.txt?现在我的脚本只是一次又一次地覆盖图像。不确定我是否必须list.txt在创建图像后立即删除行或使用awk-从文件名中grep提取小时和分钟list.txt并进行比较。

答案1

假设makeimage.py脚本总是命名文件

文件名_YYYYNN_隐马尔可夫模型.png

使用固定字符串filename,您可以对脚本执行以下修改:

while read year nr hr min sec
do
   echo "Line is >$year $nr $hr $min $sec<"
   fname="filename_${year}${nr}_${hr}${min}.png"

   if [[ -f "$fname" ]]
   then
      echo "File $fname already exists, skipping"
      continue
   fi

   echo "$year $day $hr $min $sec" > "$BIN/line.txt"

   python3 "$BIN"/makeimage.py #creates image 
done < $BIN/list.txt

这将在 shell 变量中组装预期文件名$fname,并使用 bash 测试运算符[[ ... ]]检查文件名是否$fname已存在于当前目录中(如果文件位于不同的目录中,则将其添加到变量$fname或测试构造中)。如果是,则使用语句跳到下一个循环迭代continue

作为旁注,您应该始终用双引号 shell 变量,除非您明确希望发生全局扩展和分词。

相关内容