Domanda Controlla se esiste una directory in uno script di shell


Quale comando può essere usato per verificare se una directory esiste o no, all'interno di uno script di shell?


2988
2017-09-12 20:06


origine


risposte:


Per verificare se esiste una directory in uno script di shell puoi usare quanto segue:

if [ -d "$DIRECTORY" ]; then
  # Control will enter here if $DIRECTORY exists.
fi

O per verificare se una directory non esiste:

if [ ! -d "$DIRECTORY" ]; then
  # Control will enter here if $DIRECTORY doesn't exist.
fi

Tuttavia, come Jon Ericson sottolinea che i comandi successivi potrebbero non funzionare come previsto se non si tiene conto del fatto che un collegamento simbolico a una directory supererà anche questo controllo. Per esempio. eseguendo questo:

ln -s "$ACTUAL_DIR" "$SYMLINK"
if [ -d "$SYMLINK" ]; then 
  rmdir "$SYMLINK" 
fi

Produrrà il messaggio di errore:

rmdir: failed to remove `symlink': Not a directory

Quindi i collegamenti simbolici potrebbero dover essere trattati in modo diverso, se i comandi successivi si aspettano le 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 delle doppie virgolette usate per avvolgere le variabili, la ragione di ciò è spiegata da 8jean in un'altra risposta.

Se le variabili contengono spazi o altri caratteri insoliti, probabilmente causerà il fallimento dello script.


4131
2017-09-12 20:07



Ricordati di avvolgere sempre le variabili tra virgolette quando fai riferimento a esse uno script di bash. I bambini di questi tempi crescono con l'idea che possano avere spazi e molti altri personaggi divertenti nei loro nomi di directory. (Spazi! Ai miei tempi, non avevamo spazi fantastici!;))

Un giorno, uno di quei ragazzi eseguirà il tuo copione con $DIRECTORY impostato "My M0viez" e il tuo script esploderà. Tu non vuoi quello. Quindi usa questo.

if [ -d "$DIRECTORY" ]; then
    # Will enter here if $DIRECTORY exists, even if it contains spaces
fi

454
2017-09-15 22:00



Notare la -d il test può produrre risultati sorprendenti:

$ ln -s tmp/ t
$ if [ -d t ]; then rmdir t; fi
rmdir: directory "t": Path component not a directory

File sotto: "Quando una directory non è una directory?" La risposta: "Quando si tratta di un collegamento simbolico a una directory". Un test leggermente più approfondito:

if [ -d t ]; then 
   if [ -L t ]; then 
      rm t
   else 
      rmdir t
   fi
fi

Puoi trovare ulteriori informazioni nel manuale di Bash su Bash espressioni condizionali e il [ comando incorporato e il [[ comando composto.


203
2017-09-12 20:26



Io trovo il doppia-staffa versione di test rende più logici i test di logica di scrittura:

if [[ -d "${DIRECTORY}" && ! -L "${DIRECTORY}" ]] ; then
    echo "It's a bona-fide directory"
fi

198
2017-09-12 21:33



Forma più breve:

[ -d "$DIR" ] && echo "Yes"

125
2017-09-12 21:08



Per verificare se esiste una directory puoi usare la struttura semplice se così:

if [ -d directory/path to a directory ] ; then
#Things to do

else #if needed #also: elif [new condition] 
# things to do
fi

Puoi farlo anche in negativo

if [ ! -d directory/path to a directory ] ; then
# things to do when not an existing directory

Nota: Fai attenzione, lascia spazi vuoti su entrambi i lati delle bretelle di apertura e chiusura.

Con la stessa sintassi puoi usare:

-e: any kind of archive 

-f: file 

-h: symbolic link 

-r: readable file 

-w: writable file 

-x: executable file 

-s: file size greater than zero 

118
2018-04-08 02:50



if [ -d "$DIRECTORY" ]; then  
    # Here if $DIRECTORY exists  
fi

94
2018-04-15 08:07