
我的主目錄中的另一個資料夾中正在建立一個資料夾,我希望能夠分析該資料夾的內容,但是,我有一個問題:在建立該資料夾後,它會立即被刪除建立它的同一個程式.有什麼方法可以允許它建立該資料夾,但又不刪除它?我正在運行 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 ]]
這對我來說還不起作用;創建子 shell 的開銷似乎使其足夠慢,足以讓另一個循環每次獲勝。也許使用 API 用 C 語言編碼
inotify
,這可以工作。