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 -emptypode não estar disponível em findversõ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 MyDircontenha diretórios vazios. Depois de remover esses diretórios vazios, MyDirele se tornará um diretório vazio e também deve ser removido. Portanto, eu uso o comando rmdircom 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 findversã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 0usar 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%, bashmas 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 $?=2quando o diretório não existe. Mas não há diferença entre um arquivo e um diretório vazio.