Estou usando o macOS com rm
ferramenta do GNU coreutils (não do próprio macOS rm
).
Então eu tenho um script onde eu limpo algum diretório assim:
if [ -d "${cleanup_repo_clone_root}" ]; then
echo "Cleaning up tmp directory: ${cleanup_repo_clone_root}"
set -x; rm -rf -- "${cleanup_repo_clone_root}"
fi
Eu joguei um set -x
lá para ver o que está acontecendo.
Está me mostrando a saída:
+ set -x
+ rm -rf -- /var/folders/h7/n46zg3md4l57vzsgxcs355/T/tmp.eizQw1iNBQ
rm: cannot remove '/var/folders/h7/n46zg3md4l57vzsgxcs355/T/tmp.eizQw1iNBQ': Directory not empty
mas se eu copiar e colar esse comando rm e executá-lo, funciona bem!
$ rm -rf -- /var/folders/h7/n46zg3md4l57vzsgxcs355/T/tmp.eizQw1iNBQ
O que esta acontecendo aqui?
rm
As ações de ao operar em vários arquivos ou diretórios não são atômicas. Isso importa neste caso porquerm -r
faz uma busca de baixo para cima por arquivos e diretórios, removendo-os das folhas para a raiz do caminho solicitado. Ele faz issounlink
ing ermdir
ing até não sobrar nada, e entãormdir
é o diretório final.Essas coisas acontecem em sequência, portanto, se mais arquivos forem criados antes que um
rmdir
seja emitido, você receberá de voltaENOTEMPTY
("Diretório não está vazio").É mais do que provável que seu script ou outro processo em execução no sistema esteja criando coisas simultaneamente com o arquivo
rm -rf
. Você pode precisar pensar sobre:rm -rf
se falhar e retornar ENOTEMPTY (embora o outro aplicativo possa falhar, pois o diretório foi removido abaixo dele)Você pode encontrar o outro aplicativo que está criando arquivos usando algo como
fanotify
ou um script eBPF, comoopensnoop
de BCC .inotify
também pode ser útil, mas infelizmente não inclui o processo de criação de arquivos em sua saída.Outra possibilidade é que a remoção de um arquivo falhou, mas isso pode ser mascarado por
-f
. Tente executar sem-f
para ver qual pode ser o erro nesse caso.Acontece que uma
open $dir
chamada anterior que eu estava fazendo estava iniciando um dos subdiretórios do diretório que desejo remover no macOS Finder (aplicativo de desktop do navegador de arquivos).Parece que o macOS está dando este
Directory not empty
erro enigmático (ENOEMPTY) se houver um processo que bloqueie um dos arquivos/diretórios nesse diretório que você deseja remover.