Trova le directory vuote
Per trovare solo directory vuote (come specificato nel titolo della domanda), la risposta del mosg è corretta:
find -type d -empty
Ma -empty
potrebbe non essere disponibile su find
versioni molto vecchie (questo è il caso di HP-UX, ad esempio). Se questo è il tuo caso, consulta le tecniche descritte nella sezione seguente. Una directory è vuota? .
Elimina directory vuote
Questo è un po 'complicato: supponiamo che una directory MyDir
contenga directory vuote. Dopo aver rimosso queste directory vuote, MyDir
diventerà una directory vuota e dovrebbe essere rimossa. Pertanto utilizzo il comando rmdir
con l'opzione --parents
(o -p
) che rimuove anche le directory padre quando possibile:
find -type d -empty -exec rmdir -vp --ignore-fail-on-non-empty {} +
Nella find
versione precedente l'istruzione +
non è ancora supportata, quindi è possibile utilizzare ;
invece:
find -type d -empty -exec rmdir -vp --ignore-fail-on-non-empty {} `;`
Una directory è vuota?
La maggior parte di queste risposte spiega come verificare se una directory è vuota. Pertanto fornisco qui le tre diverse tecniche che conosco:
[ $(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
una variazione:
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
Spiegazione:
find -prune
è simile find -maxdepth 0
all'utilizzo di meno caratteri
find -type d
stampa solo le directory
find -empty
stampa le directory e i file vuoti
> 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} ))
Questo trucco è al 100% bash
ma invoca (genera) un sub-shell. L'idea è di Bruno De Fraine e migliorata dal commento di teambob . Consiglio questo se usibash e se il tuo script non deve essere portabile.
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
Nota: nessuna differenza tra una directory vuota e una inesistente (e anche quando il percorso fornito è un file).
[ $(ls -A your/dir) ]
Questo trucco è ispirato dall'articolo di nixCraft pubblicato nel 2007. Andrew Taylor ha risposto nel 2008 e gr8can8dian nel 2011.
if [ "$(ls -A your/dir)" ]
then
echo "contains files"
else
echo "empty (or does not exist or is a file)"
fi
o la versione bashism di una riga:
[[ "$(ls -A your/dir)" ]] && echo "contains files" || echo "empty or ..."
Nota: ls
ritorna $?=2
quando la directory non esiste. Ma nessuna differenza tra un file e una directory vuota.