script - Prüfen Sie, ob ein Verzeichnis in einem Shell-Skript vorhanden ist




verzeichnis erstellen bash (20)

Weitere Funktionen mit find

  • Überprüfen Sie die Existenz des Ordners in Unterverzeichnissen:

    found=`find -type d -name "myDirectory"`
    if [ -n "$found"]
    then
        # The variable 'found' contains the full path where "myDirectory" is.
        # It may contain several lines if there are several folders named "myDirectory".
    fi
    
  • Überprüfen Sie das Vorhandensein eines oder mehrerer Ordner anhand eines Musters im aktuellen Verzeichnis:

    found=`find -maxdepth 1 -type d -name "my*"`
    if [ -n "$found"]
    then
        # The variable 'found' contains the full path where folders "my*" have been found.
    fi
    
  • Beide Kombinationen. Im folgenden Beispiel wird das Vorhandensein des Ordners im aktuellen Verzeichnis überprüft:

    found=`find -maxdepth 1 -type d -name "myDirectory"`
    if [ -n "$found"]
    then
        # The variable 'found' is not empty => "myDirectory"` exists.
    fi
    

Mit welchem ​​Befehl kann geprüft werden, ob ein Verzeichnis in einem Shell-Skript existiert oder nicht?


  1. Ein einfaches Skript zum Testen, ob Verzeichnis oder Datei vorhanden ist oder nicht:

    if [ -d /home/ram/dir ]   # for file "if [-f /home/rama/file]" 
    then 
        echo "dir present"
    else
        echo "dir not present"
    fi
    
  2. Ein einfaches Skript, um zu prüfen, ob das Verzeichnis vorhanden ist oder nicht:

    mkdir tempdir   # if you want to check file use touch instead of mkdir
    ret=$?
    if [ "$ret" == "0" ]
    then
        echo "dir present"
    else
        echo "dir not present"
    fi
    

    Die obigen Skripts prüfen, ob das Verzeichnis vorhanden ist oder nicht

    $? Wenn der letzte Befehl erfolgreich ist, gibt er "0" zurück, ansonsten einen anderen Wert als Null. Angenommen, tempdir ist bereits vorhanden, dann gibt mkdir tempdir einen Fehler wie mkdir tempdir :

    mkdir: Verzeichnis 'tempdir' kann nicht erstellt werden: Datei existiert


Bei Verwendung der -e wird nach Dateien gesucht. Dies schließt Verzeichnisse ein.

if [ -e ${FILE_PATH_AND_NAME} ]
then
    echo "The file or directory exists."
fi

Denken Sie daran, Variablen immer in Anführungszeichen zu setzen, wenn Sie sie in einem Bash-Skript referenzieren. 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 ausgefallenen Räume!;))

Eines Tages wird eines dieser Kinder Ihr Skript ausführen, wobei $DIRECTORY auf "My M0viez" und Ihr Skript wird "My M0viez" . Das willst du nicht. Verwenden Sie dies also.

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

Der Befehl ls in Verbindung mit der Option -l (Langliste) gibt Attributinformationen zu Dateien und Verzeichnissen zurück.
Insbesondere das erste Zeichen der Ausgabe von ls -l ist normalerweise ein d oder ein - (Bindestrich). Im Falle eines d ist das Verzeichnis sicher ein Verzeichnis.

Der folgende Befehl in nur einer Zeile sagt Ihnen, ob die angegebene ISDIR Variable einen Pfad zu einem Verzeichnis enthält oder nicht:

[[ $(ls -ld "$ISDIR" | cut -c1) == 'd' ]] &&
    echo "YES, $ISDIR is a directory." || 
    echo "Sorry, $ISDIR is not a directory"

Praktische Anwendung:

    [[email protected] ~]$ ISDIR="$HOME/Music" 
    [[email protected] ~]$ ls -ld "$ISDIR"
    drwxr-xr-x. 2 claudio claudio 4096 Aug 23 00:02 /home/claudio/Music
    [[email protected] ~]$ [[ $(ls -ld "$ISDIR" | cut -c1) == 'd' ]] && 
        echo "YES, $ISDIR is a directory." ||
        echo "Sorry, $ISDIR is not a directory"
    YES, /home/claudio/Music is a directory.

    [[email protected] ~]$ touch "empty file.txt"
    [[email protected] ~]$ ISDIR="$HOME/empty file.txt" 
    [[email protected] ~]$ [[ $(ls -ld "$ISDIR" | cut -c1) == 'd' ]] && 
        echo "YES, $ISDIR is a directory." || 
        echo "Sorry, $ISDIR is not a directoy"
    Sorry, /home/claudio/empty file.txt is not a directory


Geben Sie diesen Code in das Bash-Promt ein

if [ -d "$DIRECTORY" ]; then
  # if true this block of code will execute
fi

Haben Sie darüber nachgedacht, das zu tun, was Sie möchten, und nicht vor dem Sprung suchen?

IE, wenn Sie vor der Eingabe prüfen möchten, ob ein Verzeichnis vorhanden ist, gehen Sie wie folgt vor:

if pushd /path/you/want/to/enter; then
    # commands you want to run in this directory
    popd
fi

Wenn der Pfad, den Sie für pushd vorhanden ist, geben Sie ihn ein und er wird mit 0 pushd bedeutet, dass then Teil der Anweisung ausgeführt wird. Wenn es nicht existiert, passiert nichts (außer einer Ausgabe, die besagt, dass das Verzeichnis nicht existiert, was wahrscheinlich ein hilfreicher Nebeneffekt für das Debuggen ist).

Scheint besser als das, was eine Wiederholung erfordert:

if [ -d /path/you/want/to/enter ]; then
    pushd /path/you/want/to/enter
    # commands you want to run in this directory
    popd
fi

Dasselbe funktioniert mit cd , mv , rm usw. ... Wenn Sie sie mit Dateien versuchen, die nicht existieren, werden sie mit einem Fehler beendet und eine Meldung ausgegeben, die besagt, dass sie nicht existiert übersprungen Wenn Sie sie mit bereits vorhandenen Dateien versuchen, wird der Befehl ausgeführt und mit dem Status 0 , so dass Ihr then Block ausgeführt werden kann.


Kürzere Form:

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

Laut Kommentar:

Wenn Sie das Verzeichnis erstellen möchten, das noch nicht vorhanden ist, verwenden Sie mkdir -p , um das Verzeichnis - und alle fehlenden Verzeichnisse im Pfad - zu erstellen. Wenn das Verzeichnis bereits vorhanden ist, mkdir -p nicht fehl mach alles auf einmal mit:

mkdir -p /some/directory/you/want/to/exist || exit 1

Prüfen Sie, ob das Verzeichnis existiert, oder erstellen Sie ein anderes

[ -d "$DIRECTORY" ] || mkdir $DIRECTORY

Sie können test -d (siehe man test ).

-d file True, wenn die Datei existiert und ein Verzeichnis ist.

Zum Beispiel:

test -d "/etc" && echo Exists || echo Does not exist

Hinweis: Der test ist mit dem Bedingungsausdruck [ (siehe: man [ )) identisch, er kann also über Shell-Skripts übertragen werden.

[ - Dies ist ein Synonym für das test Builtin, aber das letzte Argument muss ein Literal sein ] , damit es mit dem Anfang [ übereinstimmt [ .

Mögliche Optionen oder weitere Hilfe finden Sie unter:

  • help [
  • help test
  • man test oder man [

Um mehrere Verzeichnisse zu überprüfen, verwenden Sie diesen Code:

if [ -d "$DIRECTORY1" ] && [ -d "$DIRECTORY2" ] then
    # Things to do
fi

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

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

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

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

Jon Ericson weist jedoch darauf hin, dass nachfolgende Befehle möglicherweise nicht wie beabsichtigt funktionieren, wenn Sie nicht berücksichtigen, dass ein symbolischer Link zu einem Verzeichnis diese Prüfung ebenfalls besteht. ZB das ausführen:

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

Erzeugt die Fehlermeldung:

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

Symbolische Links müssen daher 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 insbesondere die Anführungszeichen, mit denen die Variablen umbrochen werden. Der Grund hierfür wird in einer anderen Antwort von 8jean erläutert.

Wenn die Variablen Leerzeichen oder andere ungewöhnliche Zeichen enthalten, wird das Skript möglicherweise fehlschlagen.


Unten finden kann verwendet werden,

find . -type d -name dirname -prune -print

Wenn Sie prüfen möchten, ob ein Verzeichnis vorhanden ist, unabhängig davon, ob es sich um ein reales Verzeichnis oder einen Symlink handelt, verwenden Sie Folgendes:

ls $DIR
if [ $? != 0 ]; then
        echo "Directory $DIR already exists!"
        exit 1;
fi
echo "Directory $DIR does not exist..."

Erläuterung: Der Befehl "ls" gibt den Fehler "ls: / x: Keine solche Datei oder Verzeichnis" aus, wenn das Verzeichnis oder der Symlink nicht vorhanden ist, und setzt außerdem den Rückkehrcode, den Sie über "$?" Abrufen können, auf "non" -null (normalerweise "1"). Stellen Sie sicher, dass Sie den Rückkehrcode direkt nach dem Aufruf von "ls" überprüfen.


[ -d ~/Desktop/TEMPORAL/ ] && echo "DIRECTORY EXISTS" || echo "DIRECTORY DOES NOT EXIST"

[[ -d "$DIR" && ! -L "$DIR" ]] && echo "It's a directory and not a symbolic link"

Hinweis: Das Zitieren von Variablen ist eine bewährte Methode.


if [ -d "$DIRECTORY" ]; then
    # Will enter here if $DIRECTORY exists
fi

Dies ist nicht vollständig zutreffend ... Wenn Sie in dieses Verzeichnis wechseln möchten, müssen Sie auch über die Ausführungsrechte für das Verzeichnis verfügen. Vielleicht müssen Sie auch Schreibrechte haben.

Vorher:

if [ -d "$DIRECTORY" ] && [ -x "$DIRECTORY" ] ; then
    # ... to go to that directory (even if DIRECTORY is a link)
    cd $DIRECTORY
    pwd
fi
if [ -d "$DIRECTORY" ] && [ -w "$DIRECTORY" ] ; then
    # ... to go to that directory and write something there (even if DIRECTORY is a link)
    cd $DIRECTORY
    touch foobar
fi

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




posix