Как предотвратить удаление (но не создание) объектов в папке?

Существует папка, которая создается в другой папке в моем корневом каталоге, и я хочу смочь проанализировать содержание этой папки, однако, у меня есть проблема: поскольку папка создается, она затем сразу удалена той же программой, которая создает ее. Есть ли какой-либо способ, которым я могу позволить этому создавать папку, но затем не удалять его? Я выполняю Ubuntu GNOME 15.10 с GNOME 3.18.

0
задан 10 November 2015 в 23:17

1 ответ

Нет никаких настроек разрешения, которые могут сделать это, даже с помощью ACLs, но у Вас может быть гонка с программой, с помощью 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 ]]
    

    Это (еще) не работало на меня; издержки создания подоболочки, кажется, делают его просто достаточно достаточно медленным, чтобы другой цикл победил каждый раз. Возможно, кодированный в использовании C inotify API, это могло работать.

2
ответ дан 30 September 2019 в 04:56

Другие вопросы по тегам:

Похожие вопросы: