Suponha que eu tenha uma árvore de diretório como esta:
ROOTDIR
└--SUBDIR1
└----SUBDIR2
└----SUBDIR3
Estou procurando um comando que, quando eu insiro:
$ [unknown command] ROOTDIR
A árvore de diretórios inteira pode ser excluída se não houver arquivo, mas somente dirs dentro da árvore inteira . No entanto, diga se existe um arquivo chamado hello.pdf em SUBDIR1:
ROOTDIR
└--SUBDIR1
└--hello.pdf
└----SUBDIR2
└----SUBDIR3
Em seguida, o comando deve excluir apenas SUBDIR2 e abaixo.
Respostas:
Alexis está perto. O que você precisa fazer é o seguinte:
Isso fará uma busca detalhada na árvore de diretórios até encontrar o primeiro diretório vazio e, em seguida, exclua-o. Assim, deixando o diretório pai vazio, que será excluído etc. Isso produzirá o efeito desejado (eu faço isso provavelmente 10 vezes por semana, por isso tenho certeza de que está certo). :-)
fonte
-depth
opção é necessária?find . -type d -empty -exec rmdir "{}" \;
também deve funcionar .... certo?foo/bar/baz
. A menos que você use-depth
, ele tentará excluirfoo
primeiro, falhar e você terminaráfoo/bar
após a execução.+
vez de;
remover remotamente os diretórios. Como você está fazendo isso primeiro, os filhos ainda serão removidos antes dos pais (possivelmente dependente da sua versão do rmdir / bash e dependente do rmdir não excluir diretórios não vazios). Isso funciona para mim no bash no cygwin:mkdir -p a/b/c/d ; find a -depth -type d -exec rmdir {} +
igual a
mas usa a ação "-delete" incorporada.
Observe que "-delete" implica "-pth".
fonte
Eu tentaria o seguinte:
fonte
Aqui estão alguns requisitos antes de podermos fazer isso com segurança:
Aqui está como eu faria isso no shell:
Se você não se importa com alguns erros redundantes, basta forçar a remoção de todos os diretórios com os pais e não precisa fazer nenhuma classificação (você não pode classificar cadeias terminadas NUL, o que adiciona necessidade de tr)
fonte
-empty -delete
opçõesfind
da resposta do @ go2null.fonte
find
porquefind
tem uma maneira de fazer o processamento de forma limpa:find … -exec
.Eu faria o seguinte:
fonte