同じ日付と時刻を持つ出力ファイルが存在する場合、シェルスクリプトはwhileループから行をスキップします。

同じ日付と時刻を持つ出力ファイルが存在する場合、シェルスクリプトは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

これは予想されるファイル名をシェル変数に結合し、$fnamebashテスト演算子を使用して[[ ... ]]そのファイル名が現在のディレクトリにすでに存在することを確認します(ファイルが別のディレクトリにある場合は変数またはテスト設定$fnameに追加)。$fnameその場合は、ステートメントを使用して次のループ反復にジャンプしますcontinue

注:グローバル拡張とトークン化を明示的に望まない限り、必ずシェル変数を二重引用符で囲む必要があります。

関連情報