Zaten boşsa, dizindeki dosyaları hata olmadan sil


31

Bir dağıtım komut dosyasının bir parçası olarak, geçici dizinimden bazı önbelleğe alınmış öğeleri atmak istiyorum. Gibi bir komut kullanıyorum:

rm /tmp/our_cache/*

Bununla birlikte, eğer /tmp/our_cacheboşsa (test sunucumuza hızlı bir şekilde art arda gelen birçok değişikliği iterken oldukça yaygın), bu aşağıdaki hata mesajını basıyor:

rm: cannot remove `/tmp/our_cache/*': No such file or directory

Çok önemli değil, ama biraz çirkin ve bu betiğin çıktısındaki sinyal / sinyal oranını azaltmak istiyorum.

Unix'te, dizinin zaten boş olduğundan şikayet etmeden mesajların içeriğini silmek için kısa bir yol nedir?

Yanıtlar:


48

Muhtemelen tüm dosyaları sormadan silmek istediğinden, neden var olmayan dosyaları yoksaymak için -fanahtarı kullanmıyorsun rm?

rm -f /tmp/our_cache/*

Man sayfasından:

-f, --force
          ignore nonexistent files, never prompt

Ayrıca, içinde herhangi bir alt dizin /tmp/our_cache/varsa ve bunların ve içeriklerinin de silinmesini istiyorsanız, -rgeçişi unutmayın .


3
En bariz çözüm ve bunun hakkında düşünmedim! Bu çizgi üzerinde ilk adam gibi hissediyorum xkcd.com/399 ;-)
Huygens

6
find /tmp/our_cache/ -mindepth 1 -delete

Düzenle 1

"-type f kaldırıldı

Düzenle 2

-mindepth 1Arama kök dizininin kaldırılmasını önlemek için standart dışı seçenek eklendi ( -type fsınırlamaları kaldırdıktan sonra ).


Sadece bir not, -type fgeçici dizinler olabileceği için dışarıda bırakacağım (söz konusu örnekte onları hesaba
katmamasına

1
kullanmak -type fsadece normal dosyaları sileceğinden, örneğin sembolik bağlar silinmeyecektir.
Huygens

@rush Üzgünüm, bunu kontrol etmedim ama "Dosyaları sil" yazan man sayfalarına bir baktım, dizinleri de zaten söylemedim. Yorumumu sildim.
Hauke, 15.03.06

1
Bu kaldırır, /tmp/our_cacheböylece yaptığınız gibi rm -r /tmp/our_cache. Standart olmayan seçenekleri kullanırken, kullanabilirsiniz -mindepth 1. Bunun aksine rm /tmp/our_cache/*, alt dizinleri, bunların içeriklerini ve gizli dosyalarını da kaldırır.
Stéphane Chazelas

2

Standart hatayı /dev/null, bunu yazdırmayacak şekilde yönlendirebilirsiniz.

$  rm /tmp/our_cache/* 2>/dev/null

2
Bu, kullanımda olduğu için bir dosyanın silinemediği durumlarda gösterilen hataları da göstermez mi? Bastırmak istediğim tek hata, hedef dizin boşsa gösterilen hatadır; Bu istenmeyen yan etkileri olacak gibi görünüyor.
Mark Amery

Bazı işlemlerin açtığı bazı dosyaları silmeyi deneseniz bile, bir hatayla karşılaşmazsınız.
pradeepchhetri 15.03.2013

1

Başka bir yol (biraz overkill ...):

[ ! -z "$(ls -A /tmp/our_cache/)" ] && rm -rf /tmp/our_cache/*

Bu kullanımlar testveya [teste dize bir çalışan dönen eğer lssenin dizin boş değil. Sonra eğer, ve sadece eğer, o dize boş değilse, dizinin altındaki her şeyi kaldırır.

NOT: glob'u dışarıda bırakmak lsdosya bulunmamasını önler.


-1

Komut dosyanız BASH kullanıyorsa:

if test "$(ls /tmp/our_cache/)" !=  ""; then rm /tmp/our_cache/*; fi

Bunu yapmak, "gerçek" bir sorun varsa veya bir dosya korumalıysa (o zaman bu tür dosyaları silmek için -fdeğiştiriciye ihtiyacınız olacaksa) yine de bir hata üretecektir, rmancak hiçbir dosya yokken bu hatadan kaçınmanız gerekir.

Komut dosyanız için zsh, ksh gibi BASH'den başka bir kabuk kullanırsanız, daha taşınabilir olabilen bu diğer sözdizimini deneyebilirsiniz:

if [[ "$(ls /tmp/our_cache/)" !=  "" ]]; then rm /tmp/our_cache/*; fi
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.