Quale comando può essere usato per controllare se una directory esiste o no, all'interno di uno script di shell?
Per controllare se una directory esiste in uno script di shell si può usare il seguente:
if [ -d "$DIRECTORY" ]; then
# Control will enter here if $DIRECTORY exists.
fi
O per controllare se una directory non esiste:
if [ ! -d "$DIRECTORY" ]; then
# Control will enter here if $DIRECTORY doesn't exist.
fi
Tuttavia, come Jon Ericson fa notare, i comandi successivi potrebbero non funzionare come previsto se non si tiene conto che un link simbolico a una directory passerà anche questo controllo. Ad esempio, eseguendo questo:
ln -s "$ACTUAL_DIR" "$SYMLINK"
if [ -d "$SYMLINK" ]; then
rmdir "$SYMLINK"
fi
produrrà il messaggio di errore:
ln -s "$ACTUAL_DIR" "$SYMLINK"
if [ -d "$SYMLINK" ]; then
rmdir "$SYMLINK"
fi
;
rmdir: failed to remove `symlink': Not a directory
Quindi i collegamenti simbolici potrebbero dover essere trattati diversamente, se i comandi successivi si aspettano delle directory:
if [ -d "$LINK_OR_DIR" ]; then
if [ -L "$LINK_OR_DIR" ]; then
# It is a symlink!
# Symbolic link specific commands go here.
rm "$LINK_OR_DIR"
else
# It's a directory!
# Directory command goes here.
rmdir "$LINK_OR_DIR"
fi
fi
Prendete nota in particolare delle doppie virgolette usate per avvolgere le variabili, il motivo è spiegato da 8jean in un'altra risposta.
Se le variabili contengono spazi o altri caratteri insoliti, probabilmente causerà il fallimento dello script.
Si noti che il test -d può produrre alcuni risultati sorprendenti:
$ ln -s tmp/ t
$ if [ -d t ]; then rmdir t; fi
rmdir: directory "t": Path component not a directory
File under: "Quando una directory non è una directory? " La risposta: "Quando è un symlink a una directory." Un test leggermente più approfondito:
if [ -d t ]; then
if [ -L t ]; then
rm t
else
rmdir t
fi
fi
Potete trovare maggiori informazioni nel manuale di Bash sulle espressioni condizionali di Bash e il [[
comando builtin](https://www.gnu.org/software/bash/manual/bash.html#index-_005b) e il [[[
comando composto](https://www.gnu.org/software/bash/manual/bash.html#index-_005b_005b).
find
Controlla l'esistenza della cartella nelle sottodirectory:
found=`find -type d -name "myDirectory"`
if [ -n "$found"]
allora
# La variabile 'found' contiene il percorso completo dove si trova "myDirectory".
# Può contenere diverse righe se ci sono diverse cartelle chiamate "myDirectory".
fi
Controlla l'esistenza di una o più cartelle basate su uno schema all'interno della directory corrente:
found=`find -maxdepth 1 -type d -name "my*"`
if [ -n "$found"]
allora
# La variabile 'found' contiene il percorso completo dove sono state trovate le cartelle "my*".
fi
Entrambe le combinazioni. Nell'esempio seguente, verifica l'esistenza della cartella nella directory corrente:
found=`find -maxdepth 1 -type d -name "myDirectory"`
if [ -n "$found"]
allora
# La variabile 'found' non è vuota => "myDirectory"` esiste.
fi