1

シェルスクリプトで特定のファイルが現れるのを待ちたい

inotifywait -m -r -q -e close_write -e moved_to --format '%w/%f' $ARCHIVE_ROOT | while read FILE; do
# Call other programs which process the file like stat or sha1sum
done

コードを処理している間は、ファイルが有効であると想定していました。悲しいことに、ファイルはsha1sum. ファイルを長持ちさせるために必要な明らかな何かを見逃していませんか?

4

1 に答える 1

1

多くのプロセスで一時ファイルが作成され、すぐに削除されます。これが進歩の性質です。

ループの実行中にファイルが削除されないようにするには、ハードリンクを使用します。

inotifywait -m -r -q -e close_write -e moved_to --format '%w/%f' $ARCHIVE_ROOT | while read FILE; do
    ln "$FILE" tmpfile$$ || continue
    sha1sum tmpfile$$
    rm tmpfile$$
done

while ループが開始する前にファイルが破棄された場合、できることは何もありません。ただし、ループの最初に存在する場合は、ハードリンクを使用すると、必要な限り存在し続けることが保証されます。

他のプロセスがファイルを変更するのを止めないハードリンク。それが問題になる場合は、コピー ( cp) が必要です。

これが機能するには、一時ファイルがオリジナルと同じファイルシステムにある必要があります。

このアプリケーションがセキュリティを重視する場合は、mktempまたはその他のユーティリティを使用して、一時ファイルの名前を生成することをお勧めします。

于 2014-05-17T20:11:46.327 に答える