フォルダー内のアイテムの削除(作成ではなく)を防ぐにはどうすればよいですか?

フォルダー内のアイテムの削除(作成ではなく)を防ぐにはどうすればよいですか?

ホーム ディレクトリ内の別のフォルダー内にフォルダーが作成されており、このフォルダーの内容を分析できるようにしたいのですが、問題が発生しています。フォルダーが作成されると、それを作成した同じプログラムによってすぐに削除されます。フォルダーの作成を許可し、その後削除しないようにする方法はありますか? Ubuntu GNOME 15.10 を GNOME 3.18 で実行しています。

答え1

ACL を使用してもこれを実行できる権限設定はありませんが、次を使用してプログラムと競合することができますinotifywait

あるターミナルで、次を実行しました:

while sleep 0.5; do if mkdir foo/bar; then echo foo; rmdir foo/bar; fi; done

ご覧のとおり、これはディレクトリを作成し、メッセージをエコーし​​、ディレクトリを削除します。これらはすべて、人間の基準では非常に速く実行されます。

そして別の例では:

while true
do
    if inotifywait -e create foo
    then
        chmod -w foo
        if [[ -d foo/bar ]]
        then
            break 
        else
            chmod +w foo
        fi
    fi
done

このコマンドは、 内に何かが作成されるのを待機しfoo、 から書き込み権限を削除してfoo、サブディレクトリをキャッチするのに間に合うかどうかをテストします。間に合わない場合は、書き込み権限を再度追加して、再度開始します。

少し待ってから:

foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
rmdir: failed to remove ‘foo/bar’: Permission denied
mkdir: cannot create directory ‘foo/bar’: File exists
mkdir: cannot create directory ‘foo/bar’: File exists
mkdir: cannot create directory ‘foo/bar’: File exists
mkdir: cannot create directory ‘foo/bar’: File exists

これは、競合状態なので、捕まえられるかどうかは運次第です。


foo/barプログラムが作成するディレクトリです。名前がわからない場合は、他の方法を試すことができます。

  • ディレクトリ内に他に何もないことを確認し、サブディレクトリが作成されたときにfoo/空でないことを確認します。空でないディレクトリのテストは、このU&Lの投稿:

    shopt -s nullglob
    if [ -n "$(ls -A foo/)" ]
    then
        break
    

    これは十分に速く機能しました。

  • inotifywaitの出力から作成されたディレクトリの名前を読み取ります。

    if dir=$(inotifywait -e create --format '%f' foo)
    then
        chmod -w foo
        if [[ -d foo/$dir ]]
    

    これは私の環境では (まだ) うまくいきませんでした。サブシェルを作成するオーバーヘッドによって、他のループが毎回勝つほど十分に遅くなるようです。API を使用して C でコーディングすればinotify、うまくいくかもしれません。

関連情報