vérifier si le répertoire existe et supprimer en une seule commande unix

108

Est-il possible de vérifier si un répertoire existe et de le supprimer si c'est le cas, sous Unix en utilisant une seule commande? J'ai une situation où j'utilise la tâche ANT 'sshexec' où je ne peux exécuter qu'une seule commande dans la machine distante. Et je dois vérifier si le répertoire existe et le supprimer ...

remo
la source
pourquoi ne pas simplement utiliser rmdir? si le répertoire n'existe pas, il échouera.
Ferruccio
4
Cela échouera. Et erreur dans mon script ANT. Cela fera planter ma version.
remo le
L'utilisation mkdir -pignorera les erreurs si elles existent déjà.
user562374
2
@ Ferruccio- l'utilisation de rm -rf / dir_name ne renvoie pas d'erreur, mais rm -rf / dir_name renvoie un tel fichier ou répertoire trouvé. (Juste testé)
remo
3
@remo bro vous venez de poster la même commande deux fois
Marcos Pereira

Réponses:

149

En supposant que $WORKING_DIRle répertoire est défini ... ce one-liner devrait le faire:

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

(sinon remplacez simplement par votre répertoire)

Nick Grealy
la source
165

Pourquoi ne pas simplement utiliser rm -rf /some/dir? Cela supprimera le répertoire s'il est présent, sinon ne faites rien. Contrairement à rm -r /some/dircette saveur, la commande ne plantera pas si le dossier n'existe pas.

Dominic Mitchell
la source
13
Je pense que la question originale visait à signifier: effectuez la suppression uniquement lorsque le fichier / répertoire existe ou non. Cette commande peut fonctionner et produire des résultats similaires, mais en fait un test avant que la commande n'ait plus de sens.
Ankur Chauhan
5
@AnkurChauhan +1, j'ai reçu un avertissement si le répertoire n'existe pas.
inf3rno
12
Ce n'est pas la réponse à la question.
xpto
10
Comme indiqué ci-dessus, ce n'est pas la réponse. Une raison de tester avant de supprimer serait dans un travail Jenkins. Si le répertoire n'existe pas et que vous essayez de le supprimer, le travail échouera. Une vérification préalable est la meilleure option.
bûcheron
8
Je pense que c'est la bonne réponse. il fait ce dont @remo a besoin, c'est-à-dire ne supprimant un répertoire que s'il existe et ne donnant pas d'erreur dans le cas contraire. Peut-être que la question n'est pas tout à fait bien posée car pourquoi auriez-vous besoin de vérifier l'existence alors que cette commande ne s'en soucie pas?!
pedram bashiri
32

Essayer:

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

EDIT : Cela fonctionnera si vous pouvez exécuter bash sur la machine distante ....

EDIT 2 : Dans bash, [ -d something ]vérifie s'il existe un répertoire appelé «quelque chose», renvoyant un code de réussite s'il existe et est un répertoire. Le chaînage des commandes avec && exécute la deuxième commande uniquement si la première a réussi. Exécute donc [ -d somedir ] && commandla commande uniquement si le répertoire existe.

sinelaw
la source
Oui, et essayez-le dans un shell pour vous assurer que c'est ce que vous voulez.
sinelaw
Premièrement, je veux voir si cela fonctionne localement et eux, je peux envoyer la commande à distance. Est-ce que je cherche à dire de vérifier le répertoire "/ test" .. juste [-d / test] && mkdir / test?
remo le
1
Il devrait donner une erreur s'il existe, car il vérifie si le répertoire existe, et si oui, il essaie de le créer. C'est ce qu'il fait pour moi (juste testé). Il ne devrait pas créer de répertoire. Puisque vous voulez SUPPRIMER, vous avez probablement besoin de: [ -d /test ] && rmdir /test(ou rm -rf / test s'il ne va pas être vide et que vous voulez supprimer tout le contenu)
sinelaw
@SineLaw: REMARQUE - Il n'y a pas eu d'erreur lorsque le répertoire existait pour moi, et en essayant de créer un répertoire! (testé à nouveau). Mais pour DELETE, cela fonctionne. Veuillez vérifier cela
remo
sharma: utilisez-vous bash? que dit «echo $ SHELL»?
sinelaw
0

Voici une autre doublure:

[[ -d /tmp/test ]] && rm -r /tmp/test
  • && signifie exécuter l'instruction qui suit uniquement si l'instruction précédente a été exécutée avec succès (code de sortie renvoyé zéro)
Akhilesh Joshi
la source