Bir dosya eksik olduğunda rm bildirmedi mi?


38

Dosyaları çeşitli dizinlerden kaldırmak istediğim bir bash betiğim var. Sık sık orada olmazlar, çünkü üretilmediler ve sorun değil. Komut dosyasını bu hatayı bildirmemenin bir yolu var mı, ancak rm'nin bunu bildirecek başka bir çıktısı varsa?

Alternatif olarak, daha az gürültülü olacak dosyayı kaldırmak için kullanılacak daha iyi bir komut var mı?

Yanıtlar:


65

-fSeçeneğini kullanın . Var olmayan dosyaları sessizce göz ardı eder.

Kimden man rm:

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

["Asla sorma" bölümü, (a) -fdaha önce belirtilen herhangi bir seçeneği -iveya -Iseçeneği geçersiz kıldığını ve (b) yazmaya karşı korumalı dosyaların sormadan silineceği anlamına gelir.]

Örnek

Olmadan -f, rmeksik dosyalar hakkında şikayet edecek:

$ rm nonesuch
rm: cannot remove ‘nonesuch’: No such file or directory

İle -f, sessiz olacak:

$ rm -f nonesuch
$

4
Oh, yeni çıkarımı istemedi, var olmayanları da görmezden geldiğini anlamadım. Adama bakarken bunu tamamen atladım. :-) Teşekkür ederim. Bunu en kısa sürede cevap olarak işaretleyeceğim.
flickerfly

9

Senin gereksinimi olduğunu ise rmeksik dosyalar hakkında şikayet etmiyor, ama aynı zamanda herhangi istediğiniz diğer çıktı rm, benim önerim hedef dosyanın varlığını ilk teste olacağını ve sadece çağrı rm( olmadan-f dosya gerçekten varsa bayrak).

# rest of script
# ...
[ -e "$file" ] && rm "$file"
# ...
# rest of script

rm -fÖrneğin, kullanıcı yazma izinlerine sahip olmayan bir dosyayı çağırmak , dosyayı kaldıracak ve aynı zamanda bu senaryo için normal istemi de yayınlamayacaktır .

Aynı fikri birden fazla dosyayla kullanmak istemeniz durumunda, şöyle bir fonksiyon tanımı oluşturacağım:

qrm() {
  for f
  do
    [ -e "$f" ] && rm "$f"
  done
}

Gibi kullanın: qrm file1 file2-does-not-exist *.txt etc here


1
Dosyanın test ve kaldırma arasında silindiği (veya yaratıldığı) bir yarış koşulunun çok az şansının farkında olmak önemlidir, ancak birinin kabuk komut dosyası kullanacağı herhangi bir tipik durumda alakalı olduğunu düşünemiyorum. .
David Z

7

rmÇalıştırırken komuttaki diğer çıktıları görmek istediğinizi belirttiğinizde , ancak -fseçeneği kullanmak bunları bastıracaktır. İstediğiniz şey için STDERR'yi filtrelemeniz gerekecektir, ki bu biraz zor, her şeyin gösterilmesini istediğinizde.

Bunun gibi bir komut kullanmak isteyeceksiniz:

rm -f filename 3>&1 1>&2 2>&3 3>&- | grep -v 'No such file or directory'

Komut açıkladı:

  • -f argüman, onay veya hatalar için zorlama yapmak ve sormamak
  • 3>&1 1>&2 2>&3 3>&-(Eğer bu konuda daha fazla okuyabilirsiniz filtreleme için STDOUT ve STDERR etrafında geçmektir burada isteseydi
  • | grep -v 'No such file or directory' görmek istemediğiniz mesajı filtreliyor

Şimdi, yalnızca hata mesajlarını tamamen gizlemek istiyorsanız, aşağıdaki komutu çalıştırabilirsiniz:

rm filename 2> /dev/null

Bu komut STDERR'yi / dev / null dizinine yönlendirir, böylece komutu çalıştırdığınızda görmezsiniz.


1
(AFAICS) rmhiçbir -vzaman stdout çıktısı olmadan , sadece stderr, bu yüzden bu durumda 2>&1 | grepdaha genel olarak yararlı olan dans olmadan yapabilirsin ,
dave_thompson_085

4

Alternatif olarak, findkomutu seçenekle birlikte kullanabilirsiniz -delete. Bu (tabii ki) yalnızca bulduğu dosyaları siler, böylece hiçbiri yoksa asla uyarmaz. Bir örnek olabilir:

find /var/log/triffids/ -name "*.log" -mtime 30 -delete

bu, /var/log/triffids/dizinde arama yapar ve .log30 günden uzun bir süredir değiştirilmeyen son ekli tüm dosyaları siler .

Her zaman bu komutları çalıştırmak için iyi bir fikirdir olmadan-delete emin beklediğiniz dosyaları buluyor yapmak, ilk seçenek.


Bu seçeneği seviyorum ve bir değişiklik olarak değerlendireceğim. Paylaştığın için teşekkürler.
flickerfly

3

Aşağıdaki --force( -f) seçeneğini işaretleyin rm:

-f, --force

var olmayan dosyaları ve argümanları yoksay, asla sorma


2

Bu bir kesmek, ancak her zaman touchkaldırılmak üzere dosya olabilir . Eğer yoksa, onu kaldıracak şekilde yaratılacaktır rm.


Performans dışında, bundan hoşlanmıyorum - sadece var olmayanları silmek yerine, K dosyalarına dokunmak ne kadar pahalı?
Dani_l

0

-fMan sayfasına göre, olduğu gibi kullanabilirsiniz :

Dosya izinlerinden bağımsız olarak, onay istemeden dosyaları kaldırmayı deneyin. Dosya yoksa, bir tanılama mesajı görüntülemeyin veya bir hatayı yansıtacak şekilde çıkış durumunu değiştirin. Ayrıca, -f seçeneğinin önceki -i seçeneklerini geçersiz kıldığını da unutmayın.

rm -f xyz-directory

size hiçbir şey sormayacak ve tam olarak ne istersen onu yapacağım.


-1

İki ana yol vardır: -f seçeneğini eklerseniz, "yok" hatasını ve ikisini göstermez: (sadece herhangi bir komut için çalışır) sadece "command" do "komutunu kullanmak yerine 2> / dev komutunu kullanın / null "burada" the command ", yaptığınız komuttur.


1
Borulardan kaçıyordum çünkü ortaya çıkabilecek diğer hataları gevşetmek istemiyorum. Ne olacağını bilmiyorum.
flickerfly
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.