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?
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
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 gibtmkdir tempdir
einen Fehler wiemkdir 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
Die tldp.org/LDP/abs/html/testconstructs.html#DBLBRACKETS von test
macht das Schreiben logischer Tests natürlicher:
if [[ -d "${DIRECTORY}" && ! -L "${DIRECTORY}" ]] ; then
echo "It's a bona-fide directory"
fi
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 dastest
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
oderman [
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