Em uma versão antiga do Unix, o rm
comando excluiria diretórios se eles estivessem vazios. Na página do manual Research Unix Eighth Edition para rm : "Se uma entrada for um diretório, ela será removida apenas se estiver vazia." Eu gosto desse comportamento, então tenho esse alias no meu /etc/profile
: alias rm='rm -d'
estou usando a versão GNU coreutils do rm
, na qual -d
diz rm
para ir em frente e remover os diretórios, se estiverem vazios.
Por enquanto, tudo bem. Esse alias permite que eu use rm
como nos velhos tempos. No entanto, gostaria de dar um passo adiante. eu gostariarm
para excluir um diretório, mesmo que o diretório contenha outros diretórios, desde que os diretórios sejam a única coisa lá. Não importa a profundidade da estrutura de diretórios, desde que não haja arquivos, apenas diretórios vazios (quando você chegar ao fundo), eu gostaria rm
de removê-los todos.
Isso poderia ser escrito como um alias que ainda funcionaria como regular rm
e excluiria os arquivos passados para ele?
rmdir -p
?mkdir -p a/b1/c2 && mkdir -p a/b2/c2; rmdir -p a/b1/c1;
, ainda fico com a, a / b2 e a / b2 / c2. O que eu gostaria é de passar apenas o nível superior (a neste caso)rm
e remover tudo abaixo dele.Respostas:
Você deseja percorrer uma árvore de diretórios e ver se ela contém algo diferente de um diretório. Isso está além
rm
dos recursos. Você precisa de outras ferramentas comofind
. Você pode excluir os diretórios vazios em um determinado diretório desta maneira (também-depth
faz com que os diretórios pai que ficam vazios sejam excluídos):Aqui está uma função que, para cada argumento, exclui o argumento se for um arquivo que não seja de diretório ou uma árvore de diretórios que não contenha nada além de diretórios. Observe que essa função não é atômica: se um dos argumentos for alterado enquanto estiver em execução, você poderá receber uma mensagem de erro, mas é seguro que não exclua nenhum diretório que não seja um diretório passado como argumento.
fonte