Bir dosya yoksa, rm'nin hata vermemesini nasıl sağlayabilirim?


329

Derlemenin sonunda gereksiz dosyaları temizleyecek bir makefile yazıyorum. Zaten bir hedef yapıldıysa, elbette bu hedefi atlayacak ve işe yaramaz dosya orada olmayabilir. Yani bunu yaparsam:

rm lexer.ml interpparse.ml interpparse.mli

Dosyalardan biri olmadığı için hatalar alıyorum. rmBu dosyaları yoksaymamayı söylemenin bir yolu var mı ?

Kılavuz sayfasını okurken aşağıdaki seçeneği görüyorum:

 -f          Attempt to remove the files without prompting for confirma-
             tion, regardless of the file's permissions.  If the file does
             not exist, do not display a diagnostic message or modify the
             exit status to reflect an error.  The -f option overrides any
             previous -i options.

Neredeyse istediğim gibi geliyor ama izinler bölümünden gerçekten emin değilim. Bunu yapmanın bir yolu var mı?


rmKum havuzunda biraz denedin mi? -fGlobbing ne olursa olsun, tam olarak ne istersen onu yapıyor gibi görünüyor .
JMD

Eğer izinler buna izin vermiyorsa, rm -fseçeneği ile yine de silmeyi deneyecektir. Başarısız olacak. Size başarısız olduğunu söylemez. Dosya adı değişken veya glob ise kullanışlıdır.
LawrenceC

sadece bütünlük için: bir hata çıkış durumu döndürmüyorsa dışında rm --interactive=neverhangi gibi davranır rm -f. daha fazla ayrıntı için buraya bakın: unix.stackexchange.com/questions/72864/…
lesmana

Yanıtlar:


282

-fSeçenek kullanmakta istediğiniz şeyi kesinlikle.

Gönderdiği dosya izinleri ile ilgili onay şudur:

$ touch myfile    
$ chmod 400 myfile
$ rm myfile       
rm: remove write-protected regular empty file `myfile'?

Yani rmsen yazma izinlerine sahip olmadığınız bir dosyayı silmeye çalışırsanız sizi uyaracaktır. Dizine yazma izniniz varsa, buna izin verilir, ancak biraz gariptir, bu yüzden rmnormalde sizi bu konuda uyarır.


1
Çoğu, ancak tüm sistemler sormayacak (sanırım). Bazıları gerektirir -i.
DaveParillo

1
Hata mesajını almak, ancak hata çıkış kodunu istemiyorsanız, Giel Berkers tarafından verilen cevaba bakınız . set -eTüm bash scriptlerimde kullanıyorum , böylece komut herhangi bir hata verdikten sonra çıkıyor. Genellikle bir komut dosyası rmbir hata verirse bana söyler , ancak yine de devam etmek istiyorum . devam ediyor.
cledoux,

124

Başka bir çözüm bu: https://stackoverflow.com/questions/11231937/bash-ignoring-error-for-a-particular-command

Sadece emrinizden sonra bir OR-ifadesi ekleyin:

rm -rf my/dir || true

Bu şekilde, # 1 ifadesi başarısız olduğunda (hata atar), basitçe ifade # 2'yi çalıştırın true.


4
Hatayı yazdırır ve benim durumum için istenen işleme devam eder.
worldsayshi

9
Ya da sadece rm -rf my/dir ||:daha kısa ve özlü olmak ( :kısacık true)
Godsmith

Bence daha iyi bir çözüm. Neler olduğunu ve sonuç kodunun neden göz ardı edildiğini kolayca görebilirsiniz. Bunu sevdim!
Mavamaarten

76

Partiye geç kaldım ama bunu her zaman kullanıyorum. Bir makefile içinde, -o satırın dönüş değerini yoksaymak için bir satırın başına ekleyin . Bunun gibi:

-rm lexer.ml interpparse.ml interpparse.mli

9
Bu yine de konsola hata yazdıracak; bu da sizi make çıktısında görmezden gelmeniz için eğitecek ve muhtemelen istediğiniz şekilde değil. rm -rf bence daha iyi bir seçenek.
Godsmith,

@Godsmith Özyinelemeli silmek zorlamak yerine bir hatayı yoksaymak istiyorum. Bu çok yaramaz olabilir. Ve makefile özel sözdizimi için +1
Daishi

Eğer rm -rf "yaramaz" olabilirse, sürüm kontrolü altındaki bir dizinin dışını make kullandığınız anlamına gelir. Neden?
Godsmith

Lütfen belgelere bir link verin. Bu özelliğin açıklaması bulunamadı.
George Sovetov


14

-F seçeneğini kullanmak istemiyorsanız, bir alternatif:

rm filethatdoesntexist 2> /dev/null 

Bu sadece hataların yazdırılmasını önler.


9
Ne yazık ki bu hala bir hata çıkış kodu verecektir.
Shaun McDonald

8

Dosya adlarını gizlemenin bir yolunu rmbulursanız, bir eşleşme bulamazsanız şikayet etmez. Bu nedenle lexer.m* interpparse.*, vs. gibi bir şey sizin için işe yaramalı (elbette çok fazla silmediğinizden emin olun). Ayrıca, -fdosya izinlerinin sizi istemediğiniz bir dosyayı silmekten kurtaracağını ummadığınız sürece gitmek için oldukça makul bir yoldur - silmek istemiyorsanız listede.


Silmek istemediğim bir lexer.mll dosyası olduğu için globbing söz konusu olamaz. -F'nin neden makul olduğunu gösterdiğin için teşekkürler. Sanırım çok fazla yanlış yönlendirildikten sonra aşırı dikkatli olma eğilimindeyim sudo rm -rf.
Jason Baker

Daha kısıtlayıcı bile değil lexer.m?...? Yani yakalamak istiyorum lexer.mlve lexer.mzancak, lexer.mllya lexer.mla.
JMD

1
@JMD: Sanırım kabuğuna ve globbing için hangi kalıp eşleştirme desteğine bağlı olduğunu düşünüyorum.
Nick Bastin,

6

-F seçeneği, bir şey beklendiği gibi olmadığında sorulmayacağınız anlamına gelir. Bu, izinlerin dikkate alınmadığı anlamına gelmez.

Bir dosyayı kaldırmak için yeterli ayrıcalıklarınız yoksa, kaldırılmaz.

AMA , ayrıcalıkları değiştirmek için yeterli ayrıcalıklarınız varsa, dosyanız kaldırılır. Bu, sahibi için salt okunur izinleri olan bir dosyanın sahibi olduğunuz durumdur (-r --------). Sahibi olarak, chmod u+wdaha sonra kaldırabilirsiniz: rm -fbu dosyayı kaldıracak.


5

Belki benzer bir çizgiye yardımcı olabilir:

touch fakefile.exe fakefile.o && rm *.o *.exe

Bunun çok akıllı olmadığını biliyorum, ama işi de yapıyor.


3

Bir alternatif:

RmIfIsFile() {  for f in "$@"; do [ -f $f ] && rm $f; done; };  RmIfIsFile lexer.ml interpparse.ml interpparse.mli

Çok kötü Makefiles, kabuk işlevi tanımlarını satırlar arasında paylaşamaz.


Bir sonraki satırda devam etmek için satırın sonunda \ (ters eğik çizgi) kullanmaya çalıştınız mı?
bazıları

@some: Evet, birden fazla satıra yayılabilirler, ancak bunları tarifler arasında paylaşmak için tanımı bir make değişkenine koymak zorundasınız.
reinierpost

3

İşte kabuk betiklerinde kullandığım şey. Hata mesajını ve hata kodunu gizler.

rm doesnotexist 2> /dev/null || echo > /dev/null

nasılrm doesnotexist 2&> /dev/null
user8162

1

Dosyalara rm önce dokunabilirsiniz. eğer onlar olmasaydı onları yaratacaktı :-)

touch lexer.ml interpparse.ml interpparse.mli
rm lexer.ml interpparse.ml interpparse.mli

1

rm -rf ppp>/dev/null 2>&1 size daha yeni yazmak hata mesajı alırsanız, hata oluşursa hata oluşursa STDERR 2 değil, STDOUT 1 ... Hata üretilirse hata oluşur, uyarı verilir. Filtreyi ayarlamanız ve bu mesajı silmeniz gerekir. Ancak bu dava sıradan.


1

Dosyanın önce var olup olmadığını kontrol edin, eğer varsa, sonra rm'ye aktarın. O zaman rm'den gelen hatalar anlamlı olacaktır. -f veya hata mesajını dikkate almamak, bir kişinin istediğinden daha tipiktir. -istemenizi istemediğiniz şeyleri yapabilir.

if [ -f lexer.ml ]; then
  rm lexer.ml
fi

var olduğundan emin olmak istediğiniz daha fazla dosya varsa, daha fazla test cümlesi ekleyin.

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.