controlla se la directory esiste ed elimina in un comando unix


106

È possibile controllare se una directory esiste ed eliminarla se esiste, in Unix utilizzando un singolo comando? Ho una situazione in cui utilizzo l'attività sshexec di ANT in cui posso eseguire solo un singolo comando nella macchina remota. E ho bisogno di controllare se la directory esiste ed eliminarla ...


perché non usare solo rmdir? se la directory non esiste, fallirà.
Ferruccio

4
Fallirà. Ed errore nel mio script ANT. Ciò causerà il crash della mia build.
remo il

L'utilizzo mkdir -pignorerà gli errori se esiste già.
user562374

2
@ Ferruccio- using rm -rf / dir_name non genera un errore ma rm -rf / dir_name genera dice No such file or directory found. (Appena testato)
rimuove il

3
@remo fratello hai appena pubblicato lo stesso comando due volte
Marcos Pereira

Risposte:


149

Supponendo che $WORKING_DIRsia impostato sulla directory ... questo one-liner dovrebbe farlo:

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

(altrimenti sostituisci con la tua directory)


161

Perché non basta usare rm -rf /some/dir? Ciò rimuoverà la directory se è presente, altrimenti non fare nulla. A differenza di rm -r /some/dirquesto tipo di comando, il comando non si arresta in modo anomalo se la cartella non esiste.


13
Penso che la domanda originale volesse significare: eseguire l'eliminazione solo quando il file / directory esiste o meno. Questo comando può funzionare e produrre risultati simili, ma in realtà fare un test prima che il comando abbia più senso.
Ankur Chauhan

5
@AnkurChauhan +1, ho ricevuto un avviso se la directory non esiste.
inf3rno

12
Questa non è la risposta alla domanda.
xpto

10
Come detto sopra, questa non è la risposta. Un motivo per eseguire il test prima dell'eliminazione sarebbe all'interno di un lavoro Jenkins. Se la directory non esiste e si tenta di eliminarla, il lavoro fallirà. Controllare in anticipo è l'opzione migliore.
taglialegna il

8
Penso che questa sia la risposta corretta. fa quello che serve a @remo, cioè cancella una directory solo se esiste e non dà un errore se non lo fa. Forse la domanda non è abbastanza ben formulata perché perché dovresti controllare l'esistenza quando questo comando non si cura ?!
pedram bashiri

32

Provare:

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

EDIT : funzionerà se puoi eseguire bash sulla macchina remota ...

EDIT 2 : In bash, [ -d something ]controlla se esiste una directory chiamata "qualcosa", restituendo un codice di successo se esiste ed è una directory. Concatenare i comandi con && esegue il secondo comando solo se il primo ha avuto esito positivo. Quindi [ -d somedir ] && commandesegue il comando solo se la directory esiste.


Sì, e provalo in una shell per assicurarti che sia quello che vuoi.
sinelaw

Per prima cosa voglio vedere se funziona localmente e loro posso inviare il comando da remoto. Sto cercando di dire di controllare la directory "/ test" .. solo [-d / test] && mkdir / test?
remo il

1
Dovrebbe dare un errore se esiste, perché controlla se la directory esiste, e se sì cerca di crearla. Questo è quello che fa per me (appena testato). Non dovrebbe creare una directory. Dato che vuoi CANCELLARE probabilmente hai bisogno di: [ -d /test ] && rmdir /test(o rm -rf / test se non sarà vuoto e vuoi cancellare tutto il contenuto)
sinelaw

@SineLaw: NOTA - Non si è verificato un errore quando la directory esisteva per me e provavo a creare una directory! (provato di nuovo). Ma per DELETE Funziona. Si prega di ricontrollarlo
rimuoverlo il

sharma: stai usando bash? cosa dice "echo $ SHELL"?
sinelaw

0

Eccone un altro:

[[ -d /tmp/test ]] && rm -r /tmp/test
  • && significa eseguire l'istruzione che segue solo se l'istruzione precedente è stata eseguita correttamente (codice di uscita restituito zero)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.