如何防止刪除(但不建立)資料夾中的項目?

如何防止刪除(但不建立)資料夾中的項目?

我的主目錄中的另一個資料夾中正在建立一個資料夾,我希望能夠分析該資料夾的內容,但是,我有一個問題:在建立該資料夾後,它會立即被刪除建立它的同一個程式.有什麼方法可以允許它建立該資料夾,但又不刪除它?我正在運行 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,這可以工作。

相關內容