Überprüfen Sie, ob ein Verzeichnis vorhanden ist, und löschen Sie es in einem Befehl unter Unix

105

Ist es möglich, unter Unix mit einem einzigen Befehl zu überprüfen, ob ein Verzeichnis vorhanden ist, und es zu löschen, wenn dies der Fall ist? Ich habe eine Situation, in der ich die ANT-Task 'sshexec' verwende, in der ich nur einen einzigen Befehl auf dem Remotecomputer ausführen kann. Und ich muss überprüfen, ob ein Verzeichnis existiert und es löschen ...

remo
quelle
warum nicht einfach rmdir verwenden? Wenn das Verzeichnis nicht vorhanden ist, schlägt es fehl.
Ferruccio
4
Es wird scheitern. Und Fehler in meinem ANT-Skript. Dadurch stürzt mein Build ab.
Remo
Mit mkdir -pwird Fehler ignoriert, wenn sie bereits vorhanden sind.
user562374
2
@ Ferruccio- using rm -rf / dir_name gibt keinen Fehler aus, aber rm -rf / dir_name löst aus: Keine solche Datei oder kein solches Verzeichnis gefunden. (Gerade getestet)
Remo
3
@remo bro Sie haben gerade den gleichen Befehl zweimal gepostet
Marcos Pereira

Antworten:

149

Angenommen $WORKING_DIR, das Verzeichnis ist festgelegt ... dieser Einzeiler sollte dies tun:

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

(ansonsten einfach durch dein Verzeichnis ersetzen)

Nick Grealy
quelle
161

Warum nicht einfach benutzen rm -rf /some/dir? Dadurch wird das Verzeichnis entfernt, wenn es vorhanden ist. Andernfalls wird nichts unternommen. Im Gegensatz zu rm -r /some/dirdieser Variante stürzt der Befehl nicht ab, wenn der Ordner nicht vorhanden ist.

Dominic Mitchell
quelle
13
Ich denke, die ursprüngliche Frage sollte bedeuten: Führen Sie das Löschen nur durch, wenn Datei / Verzeichnis vorhanden ist oder nicht. Dieser Befehl funktioniert möglicherweise und führt zu ähnlichen Ergebnissen, führt jedoch einen Test durch, bevor der Befehl sinnvoller ist.
Ankur Chauhan
5
@AnkurChauhan +1, ich habe eine Warnung erhalten, wenn das Verzeichnis nicht existiert.
inf3rno
12
Dies ist nicht die Antwort auf die Frage.
Bis zum
10
Wie oben erwähnt, ist dies nicht die Antwort. Ein Grund für das Testen vor dem Löschen wäre ein Jenkins-Job. Wenn das Verzeichnis nicht vorhanden ist und Sie versuchen, es zu löschen, schlägt der Job fehl. Eine vorherige Überprüfung ist die bessere Option.
Holzfäller
8
Ich denke das ist die richtige Antwort. Es macht das, was @remo braucht, dh es löscht ein Verzeichnis nur, wenn es existiert, und gibt keinen Fehler aus, wenn es nicht existiert. Vielleicht ist die Frage nicht ganz richtig gestellt, denn warum sollten Sie die Existenz überprüfen müssen, wenn es diesem Befehl egal ist?!
Pedram Bashiri
32

Versuchen:

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

BEARBEITEN : Dies funktioniert, wenn Sie Bash auf dem Remote-Computer ausführen können.

BEARBEITEN 2 : [ -d something ]Überprüft in bash, ob es ein Verzeichnis mit dem Namen "etwas" gibt, und gibt einen Erfolgscode zurück, falls vorhanden und ein Verzeichnis. Durch Verketten von Befehlen mit && wird der zweite Befehl nur ausgeführt, wenn der erste erfolgreich war. Führt [ -d somedir ] && commandden Befehl also nur aus, wenn das Verzeichnis existiert.

sinelaw
quelle
Ja, und versuchen Sie es in einer Shell, um sicherzustellen, dass es das ist, was Sie wollen.
Sinelaw
Zuerst möchte ich sehen, ob es lokal funktioniert und sie können den Befehl remote senden. Will ich sagen, dass ich das Verzeichnis "/ test" überprüfen soll? Nur [-d / test] && mkdir / test?
Remo
1
Es sollte einen Fehler geben, wenn es existiert, weil es prüft, ob das Verzeichnis existiert, und wenn ja, versucht es es zu erstellen. Das ist es, was es für mich tut (gerade getestet). Es sollte kein Verzeichnis erstellen. Da Sie LÖSCHEN möchten, benötigen Sie wahrscheinlich: [ -d /test ] && rmdir /test(oder rm -rf / test, wenn es nicht leer sein wird und Sie den gesamten Inhalt löschen möchten)
sinelaw
@SineLaw: HINWEIS - Es ist kein Fehler aufgetreten, wenn ein Verzeichnis für mich vorhanden war und versucht wurde, ein Verzeichnis zu erstellen! (erneut getestet). Aber für DELETE funktioniert es. Bitte überprüfen Sie das noch einmal
Remo
Sharma: Benutzt du Bash? Was sagt 'echo $ SHELL'?
Sinelaw
0

Hier ist noch ein Liner:

[[ -d /tmp/test ]] && rm -r /tmp/test
  • && bedeutet, dass die folgende Anweisung nur ausgeführt wird, wenn die vorhergehende Anweisung erfolgreich ausgeführt wurde (zurückgegebener Exit-Code Null).
Akhilesh Joshi
quelle