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 ...


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)


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.


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.


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)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.