sprawdź, czy katalog istnieje i usuń jednym poleceniem unix

110

Czy można sprawdzić, czy katalog istnieje i usunąć, jeśli tak, w systemie Unix za pomocą jednego polecenia? Mam sytuację, w której używam zadania ANT 'sshexec', w którym mogę uruchomić tylko jedną komendę na zdalnej maszynie. I muszę sprawdzić, czy katalog istnieje i usunąć go ...

remo
źródło
dlaczego nie po prostu użyć rmdir? jeśli katalog nie istnieje, zakończy się niepowodzeniem.
Ferruccio
4
To się nie uda. I błąd w moim skrypcie ANT. To spowoduje awarię mojej kompilacji.
remo
Użycie mkdir -pzignoruje błędy, jeśli już istnieją.
user562374
2
@ Ferruccio- użycie rm -rf / dir_name nie powoduje błędu, ale rm -rf / dir_name zgłasza komunikat Nie znaleziono takiego pliku lub katalogu. (Właśnie przetestowane)
remo
3
@remo, bracie, właśnie dwukrotnie wysłałeś to samo polecenie
Marcos Pereira,

Odpowiedzi:

149

Zakładając, że $WORKING_DIRjest ustawiony na katalog ... ten jednolinijkowy powinien to zrobić:

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

(w przeciwnym razie po prostu zastąp swoim katalogiem)

Nick Grealy
źródło
168

Dlaczego po prostu nie użyć rm -rf /some/dir? Spowoduje to usunięcie katalogu, jeśli jest obecny, w przeciwnym razie nic nie rób. W przeciwieństwie do rm -r /some/dirtego wariantu polecenia nie ulegnie awarii, jeśli folder nie istnieje.

Dominic Mitchell
źródło
13
Myślę, że pierwotne pytanie miało znaczyć: wykonać usunięcie tylko wtedy, gdy plik / katalog istnieje lub nie. To polecenie może działać i dawać podobne wyniki, ale w rzeczywistości wykonanie testu przed poleceniem ma więcej sensu.
Ankur Chauhan
5
@AnkurChauhan +1, otrzymałem ostrzeżenie, jeśli katalog nie istnieje.
inf3rno
12
To nie jest odpowiedź na pytanie.
xpto
10
Jak wspomniano powyżej, to nie jest odpowiedź. Jednym z powodów testowania przed usunięciem jest praca Jenkinsa. Jeśli katalog nie istnieje i spróbujesz go usunąć, zadanie zakończy się niepowodzeniem. Sprawdzenie wcześniej jest lepszą opcją.
drwal
8
Myślę, że to jest poprawna odpowiedź. robi to, czego potrzebuje @remo, tj. usuwa katalog tylko wtedy, gdy istnieje i nie wyświetla błędu, jeśli tak nie jest. Może pytanie nie jest całkiem dobrze postawione, ponieważ po co miałbyś sprawdzać istnienie, skoro to polecenie nie obchodzi?
pedram bashiri
32

Próbować:

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

EDYCJA : To zadziała, jeśli możesz uruchomić bash na zdalnym komputerze ...

EDYCJA 2 : W bash [ -d something ]sprawdza, czy istnieje katalog o nazwie „coś”, zwracając kod sukcesu, jeśli istnieje i jest katalogiem. Łączenie poleceń z && uruchamia drugie polecenie tylko wtedy, gdy pierwsze się powiedzie. Więc [ -d somedir ] && commanduruchamia polecenie tylko wtedy, gdy katalog istnieje.

sinelaw
źródło
Tak, i wypróbuj go w powłoce, aby upewnić się, że tego chcesz.
sinelaw
Najpierw chcę sprawdzić, czy działa lokalnie i mogę wysłać polecenie zdalnie. Czy chcę powiedzieć, aby sprawdzić katalog "/ test" .. po prostu [-d / test] && mkdir / test?
remo
1
Powinien dać błąd, jeśli istnieje, ponieważ sprawdza, czy katalog istnieje, a jeśli tak, próbuje go utworzyć. To właśnie robi dla mnie (właśnie przetestowane). Nie powinno tworzyć katalogu. Ponieważ chcesz USUNĄĆ, prawdopodobnie potrzebujesz: [ -d /test ] && rmdir /test(lub rm -rf / test, jeśli nie będzie pusty i chcesz usunąć całą zawartość)
sinelaw
@SineLaw: UWAGA - Nie wystąpił błąd, gdy katalog istniał dla mnie i próbowałem utworzyć katalog! (ponownie przetestowałem). Ale w przypadku DELETE To działa. Sprawdź to jeszcze raz
odtwórz
sharma: czy używasz basha? co mówi „echo $ SHELL”?
sinelaw
0

Oto kolejna wkładka:

[[ -d /tmp/test ]] && rm -r /tmp/test
  • && oznacza wykonanie następującej instrukcji tylko wtedy, gdy poprzednia instrukcja została wykonana pomyślnie (zwrócony kod zakończenia zero)
Akhilesh Joshi
źródło