Frage Überprüfen Sie, ob ein Verzeichnis in einem Shell-Skript vorhanden ist


Mit welchem ​​Befehl kann innerhalb eines Shell-Skripts überprüft werden, ob ein Verzeichnis existiert oder nicht?


2988
2017-09-12 20:06


Ursprung


Antworten:


Um zu überprüfen, ob ein Verzeichnis in einem Shell-Skript existiert, können Sie Folgendes verwenden:

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

Oder um zu prüfen, ob ein Verzeichnis nicht existiert:

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

Allerdings da Jon Ericson weist darauf hin, dass nachfolgende Befehle möglicherweise nicht wie vorgesehen funktionieren, wenn Sie nicht berücksichtigen, dass eine symbolische Verknüpfung zu einem Verzeichnis diese Prüfung ebenfalls besteht. Z.B. läuft das:

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

Wird die Fehlermeldung erzeugen:

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

So müssen symbolische Links möglicherweise anders behandelt werden, wenn nachfolgende Befehle Verzeichnisse erwarten:

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

Beachten Sie besonders die doppelten Anführungszeichen, die zum Umbrechen der Variablen verwendet werden. Der Grund dafür wird von 8jean erklärt in einer anderen Antwort.

Wenn die Variablen Leerzeichen oder andere ungewöhnliche Zeichen enthalten, führt dies wahrscheinlich zum Fehlschlagen des Skripts.


4132
2017-09-12 20:07



Denken Sie daran, Variablen immer in doppelte Anführungszeichen zu schreiben, wenn Sie sie referenzieren ein Bash-Skript. Kinder wachsen heutzutage mit der Idee auf, dass sie Leerzeichen und viele andere lustige Zeichen in ihren Verzeichnisnamen haben können. (Räume! Damals hatten wir keine schönen Räume!)

Eines Tages wird eines dieser Kinder dein Skript mit ausführen $DIRECTORY einstellen "My M0viez" und dein Skript wird in die Luft gehen. Das willst du nicht. Nutze das also.

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

454
2017-09-15 22:00



Beachten Sie das -d Test kann zu einigen überraschenden Ergebnissen führen:

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

Datei unter: "Wann ist ein Verzeichnis kein Verzeichnis?" Die Antwort: "Wenn es ein Symlink zu einem Verzeichnis ist." Ein etwas gründlicherer Test:

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

Weitere Informationen finden Sie im Bash Handbuch auf Bash bedingte Ausdrücke und das [ eingebauter Befehl und das [[ zusammengesetzter Befehl.


203
2017-09-12 20:26



Ich finde das Doppelwinkel Version von test macht das Schreiben von Logiktests natürlicher:

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

198
2017-09-12 21:33



Kürzere Form:

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

125
2017-09-12 21:08



Um zu überprüfen, ob ein Verzeichnis vorhanden ist, können Sie eine einfache if-Struktur wie folgt verwenden:

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

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

Sie können es auch im negativen tun

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

Hinweis: Seien Sie vorsichtig, lassen Sie auf beiden Seiten der öffnenden und schließenden Klammern leere Stellen.

Mit der gleichen Syntax können Sie verwenden:

-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