Como evitar a exclusão (mas não a criação) de itens em uma pasta?

Como evitar a exclusão (mas não a criação) de itens em uma pasta?

Há uma pasta que está sendo criada dentro de outra pasta no meu diretório pessoal, e quero poder analisar o conteúdo desta pasta, porém, tenho um problema: à medida que a pasta é criada, ela é imediatamente excluída pelo mesmo programa que o cria. Existe alguma maneira de permitir a criação da pasta, mas não excluí-la? Estou executando o Ubuntu GNOME 15.10 com GNOME 3.18.

Responder1

Não há configurações de permissão que possam fazer isso, mesmo usando ACLs, mas você pode competir com o programa, usando inotifywait:

Em um terminal, executei:

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

Como você pode ver, isso cria um diretório, ecoa uma mensagem e remove o diretório - tudo isso acontece muito rapidamente pelos padrões humanos.

E em outro:

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

Este comando aguarda a criação de qualquer coisa em foo, remove as permissões de gravação fooe testa se chegou a tempo de capturar o subdiretório. Caso contrário, ele adiciona novamente a permissão de gravação e inicia novamente.

Depois de esperar um pouco:

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

Isso depende de umcondição de corrida, então se você conseguir pegá-lo é uma questão de sorte.


foo/baré o diretório que o programa cria. Se você não sabe o nome dele, você pode tentar outras maneiras:

  • certifique-se de que não haja mais nada no diretório, portanto, quando um subdiretório for criado, foo/ele não estará vazio. Alguns testes para diretório não vazio estão disponíveis emesta postagem da U&L:

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

    Isso funcionou rápido o suficiente.

  • leia o nome do diretório criado na inotifywaitsaída de:

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

    Isso (ainda) não funcionou para mim; a sobrecarga de criação do subshell parece torná-lo suficientemente lento para que o outro loop vença todas as vezes. Talvez codificado em C usando a inotifyAPI, isso poderia funcionar.

informação relacionada