「find -newer」と組み合わせた「touch」がスクリプトで予期せず動作します。

「find -newer」と組み合わせた「touch」がスクリプトで予期せず動作します。

ターゲット

私は新しいファイルを確認する簡単な方法を探していました。

ターゲットシステムは最小限の組み込みLinuxプラットフォームなので、より多くのパッケージをインストールすることはできません。

現在のソリューション

良い解決策は、find ... -newer reference.fileingを使用touchして繰り返し実行するようです。参照文書各実行では、次のようになります。 https://unix.stackexchange.com/a/249238/562136

私の場合、コードは次のようになります。

NEW_FILES=()
WORK_FILE_DIR="/some/folder/path"
REFERENCE_FILE="${WORK_FILE_DIR}/.last_checked_reference"

function find_new_files() {
  mapfile -t NEW_FILES < <(find "$WORK_FILE_DIR" -type f -newerBa "$REFERENCE_FILE" -name "*.txt")

  touch "$REFERENCE_FILE"
}

mkdir -p $WORK_FILE_DIR
touch $REFERENCE_FILE

while true; do
  find_new_files

  for file in "${NEW_FILES[@]}"; do
    echo "New file $file"
    # ... handle file content in multiple steps
  done
  
  echo "--"
  sleep 5
done

私は-newerBa実際にnewer

予想される動作

-newerBaファイルのみを使用作られたREFERENCE_FILEへの最後のアクセス以降の時刻をリストし、アクセス時間をアクセスするたびに更新する必要がありますtouch

出力が次のようになると予想します。

--
--
New file <file1>
--
--
--
New file <file2>
...

実際の行動

出力は次のとおりです。

--
--
New file <file1>
--
New file <file1>
--
New file <file1>
--
New file <file1>
New file <file2>
--
New file <file1>
New file <file2>
...

ただし、スクリプトの実行中に外部、つまりCLIでREFERENCE_FILEをタッチすると、期待した効果が表示されます。

--
--
New file <file1>
--
New file <file1>
-- <-- at this point, touch REFERENCE_FILE from my CLI
--
New file <file2>
--
New file <file2>
...

私が試したこと

  1. 各繰り返しを追加するstat $REFERENCE_FILEと、スクリプトの実行時に4回または3回(作成日を除くすべての時間)が正しく更新されることがわかります。

CLIでREFERENCE_FILEを更新したときに確認しましたが、stat違いはありません。

16777221 96762726 -rw------- 1 user staff 0 0 
"Feb 25 11:53:24 2023"
"Feb 25 11:53:24 2023"
"Feb 25 11:53:24 2023"
"Feb 25 01:10:39 2023" 
4096 0 0 
<path>/.last_checked_reference
--
16777221 96762726 -rw------- 1 user staff 0 0
"Feb 25 11:53:29 2023"
"Feb 25 11:53:29 2023"
"Feb 25 11:53:29 2023"
"Feb 25 01:10:39 2023"
4096 0 0 
<path>/.last_checked_reference
  1. 使用touch -a $REFERENCE_FILEtouch -m $REFERENCE_FILE
  2. 600が問題にならないように、ファイル権限を666または777に調整します。

何が起こるのか

REFERENCE_FILE を完全に削除して再作成できます。

rm "$REFERENCE_FILE"
touch "$REFERENCE_FILE"

質問

stat更新された時間が表示され、スクリプトが期待どおりに機能しない理由はわかりませんが、touch私のCLIは期待どおりに反応します。

なぜこれですか?

関連情報