como posso recursivamente excluir diretórios vazios no meu diretório home? [duplicado]

110

Eu crio diretórios com muita frequência, espalhados pelo meu diretório pessoal, e acho muito difícil localizá-los e excluí-los.

Eu quero que qualquer alias / function / script encontre / localize e exclua todos os diretórios vazios no meu diretório pessoal.

    
por Santosh Kumar 25.08.2012 / 23:14

2 respostas

221

O comando find é a principal ferramenta para operações recursivas do sistema de arquivos. Use a expressão -type d para informar ao find que você está interessado em encontrar diretórios apenas (e não em arquivos simples). A versão GNU de find suporta o teste -empty , então

$ find . -type d -empty -print

imprimirá todos os diretórios vazios abaixo do seu diretório atual.

Use find ~ -… ou find "$HOME" -… para basear a pesquisa em seu diretório pessoal (se não for seu diretório atual).

Depois de verificar se está selecionando os diretórios corretos, use -delete para excluir todas as correspondências:

$ find . -type d -empty -delete
    
por 25.08.2012 / 23:47
13

Você pode chamar rmdir em todos os diretórios, pois rmdir excluirá apenas um diretório se estiver vazio:

find "$HOME" -type d -exec rmdir {} + 2>/dev/null

Se você também quiser imprimir os diretórios sendo removidos, precisará verificar se eles estão vazios:

find "$HOME" -type d -exec bash -c 'shopt -s nullglob; shopt -s dotglob; files=("$1"/*); [[ ${files[@]} ]] || rmdir -v "$1"' -- {} \; 

Aqui está um exemplo puro (versão 4 ou superior):

shopt -s globstar
for dir in **/; do
   files=("$dir"/*)
   [[ ${files[@]} ]] || rmdir -v "$dir"
done
    
por 25.08.2012 / 23:21