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

0

Existe uma pasta que está sendo criada dentro de outra pasta no meu diretório pessoal, e eu quero poder analisar o conteúdo desta pasta, no entanto, eu tenho um problema: como a pasta é criada, é imediatamente excluído pelo mesmo programa que o cria. Existe alguma maneira que eu possa permitir que ele crie a pasta, mas não para excluí-lo? Estou executando o Ubuntu GNOME 15.10 com o GNOME 3.18.

    
por muru 10.11.2015 / 21:12

1 resposta

2

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

Em um terminal, eu corri:

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

Esse comando aguarda a criação de qualquer coisa em foo , remove as permissões de gravação de foo e testa se estava na hora de capturar o subdiretório. Caso contrário, adiciona novamente a permissão de gravação e recomeça.

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 uma condição de corrida , por isso, saber se você pode pegá-lo é uma questão de sorte.

foo/bar é o diretório que o programa faz. Se você não souber o nome dele, tente outras maneiras:

  • verifique se não há mais nada no diretório, portanto, quando um subdiretório for criado, foo/ não ficará vazio. Alguns testes para diretórios não vazios estão disponíveis em este post em 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 saída de inotifywait :

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

    Isso não funcionou (ainda) para mim; a sobrecarga de criação do subshell parece torná-lo suficientemente lento o suficiente para o outro loop ganhar a cada vez. Talvez codificado em C usando a API inotify , isso poderia funcionar.

por muru 10.11.2015 / 21:57