Apenas encontre diretórios vazios
Para encontrar apenas diretórios vazios (conforme especificado no título da pergunta), a resposta do mosg está correta:
find -type d -empty
Mas -empty
pode não estar disponível em find
versões muito antigas (é o caso do HP-UX, por exemplo). Se este for o seu caso, consulte as técnicas descritas na seção a seguir Um diretório está vazio? .
Excluir diretórios vazios
Isso é um pouco complicado: suponha que um diretório MyDir
contenha diretórios vazios. Depois de remover esses diretórios vazios, MyDir
ele se tornará um diretório vazio e também deve ser removido. Portanto, eu uso o comando rmdir
com a opção --parents
(ou -p
) que também remove os diretórios pais quando possível:
find -type d -empty -exec rmdir -vp --ignore-fail-on-non-empty {} +
Na find
versão mais antiga, a instrução +
ainda não é compatível, portanto, você pode usar em seu ;
lugar:
find -type d -empty -exec rmdir -vp --ignore-fail-on-non-empty {} `;`
O diretório está vazio?
A maioria dessas respostas explica como verificar se um diretório está vazio. Portanto, apresento aqui as três técnicas diferentes que conheço:
[ $(find your/dir -prune -empty) = your/dir ]
d=your/dir
if [ x$(find "$d" -prune -empty) = x"$d" ]
then
echo "empty (directory or file)"
else
echo "contains files (or does not exist)"
fi
uma variação:
d=your/dir
if [ x$(find "$d" -prune -empty -type d) = x"$d" ]
then
echo "empty directory"
else
echo "contains files (or does not exist or is not a directory)"
fi
Explicação:
find -prune
é semelhante a find -maxdepth 0
usar menos caracteres
find -type d
imprime diretórios apenas
find -empty
imprime os diretórios e arquivos vazios
> mkdir -v empty1 empty2 not_empty
mkdir: created directory 'empty1'
mkdir: created directory 'empty2'
mkdir: created directory 'not_empty'
> touch not_empty/file
> find empty1 empty2 not_empty -prune -empty
empty1
empty2
(( ${#files} ))
Este truque é 100%, bash
mas invoca (gera) um sub-shell. A ideia é de Bruno De Fraine e melhorada pelo comentário do teambob . Eu aconselho este se você usarbash e se seu script não precisa ser portátil.
files=$(shopt -s nullglob dotglob; echo your/dir/*)
if (( ${#files} ))
then
echo "contains files"
else
echo "empty (or does not exist or is a file)"
fi
Observação: não há diferença entre um diretório vazio e um não existente (e mesmo quando o caminho fornecido é um arquivo).
[ $(ls -A your/dir) ]
Este truque foi inspirado no artigo da nixCraft postado em 2007. Andrew Taylor respondeu em 2008 e gr8can8dian em 2011.
if [ "$(ls -A your/dir)" ]
then
echo "contains files"
else
echo "empty (or does not exist or is a file)"
fi
ou a versão de bashismo de uma linha:
[[ "$(ls -A your/dir)" ]] && echo "contains files" || echo "empty or ..."
Nota: ls
retorna $?=2
quando o diretório não existe. Mas não há diferença entre um arquivo e um diretório vazio.