Só é possível remover um diretório (com a chamada de sistema rmdir()
), se estiver vazio.
rm -r dir
remove o diretório e todos os arquivos nele, começando com as folhas da árvore de diretórios e caminhando até a raiz ( dir
).
Para remover um arquivo (com rmdir()
para diretórios e unlink()
para outros tipos de arquivos, ou *at()
variants), o que importa não é a permissão do arquivo em si, mas do diretório que você está removendo o arquivo de (tenha cuidado com o t
bit nas permissões, como por /tmp
, adiciona mais complicações a isso).
O motivo pelo qual você não pode remover non-empty-dir
é que não é possível desvincular subdir
do primeiro, pois você não tem o direito de modificar non-empty-dir
. Você teria o direito de desvincular non-empty-dir
do seu diretório pessoal, pois você tem permissão de gravação / modificação para esse, mas não é possível remover um diretório que não esteja vazio.
No seu caso, como observado por @PeterCordes nos comentários, a chamada do sistema rmdir()
falha com um código de erro ENOTEMPTY
(Diretório não vazio), mas você não tem lido permissão para o diretório, rm
não pode nem mesmo descobrir quais arquivos e diretórios (incluindo subdir
) precisariam se desvincular dele para poder esvaziá-lo (não que ele pudesse desvinculá-los se soubesse, pois não faz isso) t tem permissões de gravação).
Você também pode entrar em situações em que rm
poderia remover um diretório se ele pudesse descobrir quais arquivos estão nele, como no caso de um diretório somente de gravação:
$ mkdir dir
$ touch dir/file
$ chmod a=,u=wx dir
$ ls -ld dir
d-wx------ 2 me me 4096 Nov 30 19:43 dir/
$ rm -rf dir
rm: cannot remove 'dir': Permission denied
Ainda assim, posso removê-lo, pois sei que ele contém apenas um arquivo file
:
$ rm dir/file
$ rmdir dir
$
Note também que com Unices modernos você poderia renomear o non-empty-dir
, mas em alguns como Linux ou FreeBSD (mas não no Solaris), não movê-lo para um diretório diferente, mesmo se você também tivesse escrever permissão para esse diretório, como (eu acho e para o Linux, como sugerido por o comentário para o código relevante ) fazendo isso envolveria a modificação de non-empty-dir
(a entrada ..
apontaria para um diretório diferente).
Alguém poderia argumentar que remover seu empty-dir
também envolve a remoção das entradas ..
e .
, portanto, modificando-o, mas ainda assim, o sistema permite que você faça isso.