1

在 shell 脚本中,我想等待某个文件出现

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 回答