193 Stimmen

prüfen, ob ein Verzeichnis existiert und löschen in einem Befehl unix

Ist es möglich, unter Unix mit einem einzigen Befehl zu prüfen, ob ein Verzeichnis existiert, und es zu löschen, falls es existiert? Ich habe eine Situation, in der ich die ANT-Aufgabe "sshexec" verwende, bei der ich nur einen einzigen Befehl auf dem entfernten Rechner ausführen kann. Und ich muss prüfen, ob ein Verzeichnis existiert und es löschen...

0 Stimmen

Warum nicht einfach rmdir verwenden? Wenn das Verzeichnis nicht existiert, schlägt es fehl.

8 Stimmen

Es wird fehlschlagen. Und Fehler in meinem ANT-Skript. Das wird mein Build zum Absturz bringen.

2 Stimmen

Verwendung von mkdir -p ignoriert Fehler, wenn es bereits existiert.

305voto

Dominic Mitchell Punkte 11251

Warum verwenden Sie nicht einfach rm -rf /some/dir ? Dadurch wird das Verzeichnis entfernt, wenn es vorhanden ist, ansonsten wird nichts getan. Anders als rm -r /some/dir diese Variante des Befehls wird nicht abstürzen, wenn der Ordner nicht existiert.

21 Stimmen

Ich denke, die ursprüngliche Frage war so gemeint, dass der Löschvorgang nur durchgeführt werden soll, wenn die Datei/das Verzeichnis existiert oder nicht. Dieser Befehl kann funktionieren und ähnliche Ergebnisse liefern, aber es ist sinnvoller, vor dem Befehl einen Test durchzuführen.

8 Stimmen

@AnkurChauhan +1, ich bekomme eine Warnung, wenn das Verzeichnis nicht existiert.

14 Stimmen

Dies ist nicht die Antwort auf die Frage.

226voto

Nick Grealy Punkte 21004

Angenommen, $WORKING_DIR auf das Verzeichnis gesetzt ist... dieser Einzeiler sollte genügen:

if [ -d "$WORKING_DIR" ]; then rm -Rf $WORKING_DIR; fi

(ansonsten einfach durch Ihr Verzeichnis ersetzen)

39voto

sinelaw Punkte 15615

Versuchen Sie es:

bash -c '[ -d my_mystery_dirname ] && run_this_command'

Dies funktioniert, wenn Sie die Bash auf dem entfernten Rechner ausführen können....

In der Bash, [ -d something ] prüft, ob es ein Verzeichnis mit dem Namen 'etwas' gibt, und gibt einen Erfolgscode zurück, wenn es existiert und ein Verzeichnis ist. Die Verkettung von Befehlen mit && führt den zweiten Befehl nur aus, wenn der erste erfolgreich war. Also [ -d somedir ] && command führt den Befehl nur aus, wenn das Verzeichnis existiert.

0 Stimmen

Ja, und probieren Sie es in einer Schale aus, um sicherzustellen, dass es das ist, was Sie wollen.

0 Stimmen

Zuerst möchte ich sehen, ob es lokal funktioniert und dann kann ich den Befehl aus der Ferne senden. Soll ich das Verzeichnis "/test" überprüfen, indem ich einfach [ -d /test ] && mkdir /test verwende?

1 Stimmen

Es sollte eine Fehlermeldung geben, wenn es existiert, denn es prüft, ob das Verzeichnis existiert, und wenn ja, versucht es, es zu erstellen. Das ist es, was es bei mir tut (gerade getestet). Es sollte kein Verzeichnis erstellen. Da Sie DELETE wollen, müssen Sie wahrscheinlich: [ -d /test ] && rmdir /test (oder rm -rf /test, wenn das Verzeichnis nicht leer sein wird und Sie den gesamten Inhalt löschen wollen)

14voto

Akhilesh Joshi Punkte 240

Hier ist ein weiterer One-Liner:

[[ -d /tmp/test ]] && rm -r /tmp/test
  • && bedeutet, dass die nachfolgende Anweisung nur dann ausgeführt wird, wenn die vorangegangene Anweisung erfolgreich ausgeführt wurde (Exit-Code Null zurückgegeben)

0 Stimmen

Ich weiß nicht warum, aber [ -d node_modules ] && rm -rf node_modules funktionierte nicht mit dem GitLab CI/CD Docker-Build, während es mit der von der akzeptierten Antwort vorgeschlagenen Version zufrieden war if [ -d node_modules ]; then rm -rf node_modules; fi

0 Stimmen

@Pjotr Haben Sie die doppelten eckigen Klammern mit einbezogen? In Ihrem Kommentar fehlten sie. Doppelt gesetzte Klammern haben eine andere Bedeutung als einfach gesetzte.

0 Stimmen

@cooperised Nein, das hatte ich schon mit einem einzigen Satz Klammern, der bei mir zu funktionieren schien. Vielleicht war das der Grund, warum es auf der GitLab CI/CD-Seite immer wieder scheiterte. Aus irgendeinem Grund mochte die IDE auch die Variante mit den doppelten Klammern nicht und war mit dem inline if zufrieden. Ich würde vermuten, dass mein lokales System immer die node_modules vorhanden war.

2voto

Ich empfehle, die Dokumentation von rm Befehl. Wenn es geöffnet ist, sehen Sie, dass es einen -f Flagge macht, was Sie wollen. Beispiel : rm -f -R ./my_folder

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X