以前の実行中にすでに処理されたファイルの処理を防ぐ方法は?

以前の実行中にすでに処理されたファイルの処理を防ぐ方法は?

以下は、定義されたパス内のすべてのファイルを変更するスクリプトです。

#!/bin/bash
FILES=/path/to/files/*
for f in $FILES
do
  [some_command_to_make_changes_into_file] $f > tmp_$f; mv tmp_$f $f
done

コードは最初はうまく動作します。問題は、このスクリプトを2回目または3回目の実行時にすべてのファイルを再選択することです。どうやってできるか 進まなかった最後の実行ですでに処理されているすべてのファイルはありますか?ファイル名やパスを変更できません。

ベストアンサー1

ファイルを「処理済み」とマークできます。

#!/bin/bash
TAG="done"
FILES=/path/to/files/*
for f in $FILES
do
  case "$f" in
    *.$TAG) # process mark-files
      echo "# TAG-FILE=$f"
      b=`echo $f | sed "s/\.$TAG\$//"` # get base file of the mark-file
      echo "#   FILE=$b"
      if [ ! -f "$b" ] ; then
        echo "#  TAG-FILE REMOVE" 
        rm $f # remove mark-file without base file
      file
      continue # do not process mark-files themselves
      ;; 
  esac
  if [ -f "$f.TAG" ] ; then
    echo "# FILE=$f"
    echo "#   TAG-FILE PRESENT"
    continue # mark-file present - skip processing
  fi
  echo "# FILE=$f"
  echo "#   TAG-FILE ABSENT => PROCESSING"


  # [some_command_to_make_changes_into_file] $f > tmp_$f; mv tmp_$f $f

  echo "#   PROCESSED"
  touch "$f.$TAG" # create mark-file
  if [ -f "$f.TAG" ] ; then
    echo "#   TAG-FILE CREATED"
  else
    echo "#   TAG-FILE CREATION FAILED!"
    exit
  fi
done

可能な改善点:タグファイルを別のディレクトリに保存できます。

おすすめ記事