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.