dizinin var olup olmadığını kontrol edin ve bir komut unix'te silin


110

Unix'te tek bir komut kullanarak bir dizinin var olup olmadığını kontrol etmek ve varsa silmek mümkün müdür? Uzak makinede yalnızca tek bir komut çalıştırabileceğim ANT 'sshexec' görevini kullandığım bir durum var. Ve dizinin var olup olmadığını kontrol etmem ve silmem gerekiyor ...


neden sadece rmdir kullanmıyorsunuz? dizin yoksa başarısız olur.
Ferruccio

4
Başarısız olacak. Ve ANT betiğimde hata. Bu, yapımın çökmesine neden olacak.
remo

mkdir -pEğer zaten mevcutsa kullanmak hataları yok sayacaktır.
user562374

2
@ Ferruccio- rm -rf / dir_name kullanmak bir hata oluşturmaz, ancak rm -rf / dir_name böyle bir dosya veya dizin bulunamadı diyor. (Yeni test edildi)
remo

3
@remo kardeşim aynı komutu iki kez gönderdin
Marcos Pereira

Yanıtlar:


149

$WORKING_DIRDizine ayarlandığını varsayarsak ... bu tek satırlık hattın bunu yapması gerekir:

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

(aksi halde dizininizle değiştirin)


168

Neden sadece kullanmıyorsun rm -rf /some/dir? Bu, varsa dizini kaldırır, aksi takdirde hiçbir şey yapmazsınız. rm -r /some/dirKlasör yoksa, komutun bu çeşidinin aksine çökmez.


13
Asıl sorunun şu anlama geldiğini düşünüyorum: silme işlemini yalnızca dosya / dizin var olduğunda veya olmadığında gerçekleştirin. Bu komut çalışabilir ve benzer sonuçlar verebilir ancak aslında komuttan önce bir test yapmak daha mantıklıdır.
Ankur Chauhan

5
@AnkurChauhan +1, dir mevcut değilse uyarı aldım.
inf3rno

12
Sorunun cevabı bu değil.
xpto

10
Yukarıda belirtildiği gibi cevap bu değil. Silmeden önce test etmenin bir nedeni, bir Jenkins işinin içinde olabilir. Dizin yoksa ve onu silmeye çalışırsanız, bu iş başarısız olur. Önceden kontrol etmek daha iyi bir seçenektir.
oduncu

8
Bunun doğru cevap olduğunu düşünüyorum. @remo'nun ihtiyacı olan şeyi yapar, yani bir dizini sadece varsa silip yoksa hata vermez. Belki de soru pek iyi ifade edilmemiştir çünkü bu komut umursamıyorken neden varlığını kontrol etmeye ihtiyaç duyasınız ?!
pedram bashiri

32

Deneyin:

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

DÜZENLE : Uzak makinede bash çalıştırabilirseniz bu işe yarar ...

DÜZENLEME 2 : bash'da, [ -d something ]'bir şeyler' adında bir dizin olup olmadığını kontrol eder, varsa ve bir dizin ise bir başarı kodu döndürür. Komutları && ile zincirleme, ikinci komutu yalnızca ilk komut başarılı olursa çalıştırır. Bu yüzden [ -d somedir ] && commandkomutu yalnızca dizin varsa çalıştırır.


Evet ve istediğinizden emin olmak için bir kabukta deneyin.
sinelaw

Öncelikle yerel olarak çalışıp çalışmadığını görmek istiyorum ve onlara komutu uzaktan gönderebilirim. "/ Test" dizinini kontrol etmeyi mi düşünüyorum .. sadece [-d / test] && mkdir / test?
remo

1
Varsa bir hata vermelidir, çünkü dizinin var olup olmadığını kontrol eder ve eğer varsa onu oluşturmaya çalışır. Benim için yaptığı şey bu (yeni test edildi). Bir dizin oluşturmamalıdır. [ -d /test ] && rmdir /testSİLMEK istediğiniz için muhtemelen şunlara ihtiyacınız vardır: (veya boş olmayacaksa rm -rf / test edin ve tüm içeriği silmek istiyorsanız)
sinelaw

@SineLaw: NOT - Benim için dizin olduğunda ve bir dizin oluşturmaya çalışırken hata olmadı! (tekrar test etti). Ancak DELETE için işe yarıyor. Lütfen bunu iki kez kontrol edin
remo

sharma: bash kullanıyor musun? 'echo $ SHELL' ne diyor?
sinelaw

0

İşte başka bir astar:

[[ -d /tmp/test ]] && rm -r /tmp/test
  • &&, yalnızca önceki ifade başarıyla yürütüldüğünde (çıkış kodu sıfır döndürüldüğünde) takip eden ifadenin yürütülmesi anlamına gelir
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.