ターゲット
私は新しいファイルを確認する簡単な方法を探していました。
ターゲットシステムは最小限の組み込みLinuxプラットフォームなので、より多くのパッケージをインストールすることはできません。
現在のソリューション
良い解決策は、find ... -newer reference.file
ingを使用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>
...
私が試したこと
- 各繰り返しを追加する
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
- 使用
touch -a $REFERENCE_FILE
とtouch -m $REFERENCE_FILE
- 600が問題にならないように、ファイル権限を666または777に調整します。
何が起こるのか
REFERENCE_FILE を完全に削除して再作成できます。
rm "$REFERENCE_FILE"
touch "$REFERENCE_FILE"
質問
stat
更新された時間が表示され、スクリプトが期待どおりに機能しない理由はわかりませんが、touch
私のCLIは期待どおりに反応します。
なぜこれですか?