
ホーム ディレクトリ内の別のフォルダー内にフォルダーが作成されており、このフォルダーの内容を分析できるようにしたいのですが、問題が発生しています。フォルダーが作成されると、それを作成した同じプログラムによってすぐに削除されます。フォルダーの作成を許可し、その後削除しないようにする方法はありますか? 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
、うまくいくかもしれません。