%20de%20itens%20em%20uma%20pasta%3F.png)
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 foo
e 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
inotifywait
saí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
inotify
API, isso poderia funcionar.