zaten varsa bir dosyayı kaldırmak için kabuk komut dosyası


183

Bir dosyada veri depoladığım bazı şeyler üzerinde çalışıyorum. Ancak betiği her çalıştırdığımda önceki dosyaya eklenir.

Zaten mevcutsa dosyayı nasıl kaldırabileceğim konusunda yardım istiyorum.


3
Dosyanın var olup olmadığını kontrol edin ... ve sonra arayın rm $my_file, değil mi? Hangi kabuğu kullanıyorsun?
Chris Sprague

Yanıtlar:


184

Dosyanın var olup olmadığını kontrol etmekten çekinmeyin, kaldırmaya çalışın.

rm -f /p/a/t/h
# or
rm /p/a/t/h 2> /dev/null

Dosya yoksa ikinci komutun başarısız olacağını (sıfır olmayan bir çıkış durumu döndürün), ancak ilk komutun -f(kısa için --force) seçeneği sayesinde başarılı olacağını unutmayın . Duruma bağlı olarak, bu önemli bir ayrıntı olabilir.

Ancak büyük olasılıkla, dosyaya ekliyorsanız, bunun nedeni komut >>dosyanızın dosyaya bir şey yönlendirmek için kullanılmasıdır . Sadece yerini >>ile >. Kod sağlamadığınız için söylemek zor.

Bunun gibi bir şey yapabileceğinizi unutmayın test -f /p/a/t/h && rm /p/a/t/h, ancak bunu yapmak tamamen anlamsızdır. Testin doğru dönmesi olasıdır, ancak kaldırmaya çalışmadan önce / p / a / t / h mevcut olmaz veya daha kötüsü test başarısız olur ve / p / a / t / h oluşturulur varolan bir sonraki komutu yürütmeden önce. Bunu denemek klasik bir yarış koşulu. Yapma.


5
Var olup olmadığını ve silinip silinmediğini bilmeleri gerekiyorsa bu yararlı olmaz. Stderr yemek bunu sağlamaz. Varoluşun ele alınmaması, başarısız olmadan daha geniş bir komut dosyasının çalıştırılmasına izin vermez.
uchuugaka

Bir dosya varsa umursamıyorsun zaman @uchuugaka Bu tüm istediğiniz bu kadar emin olmaktır, basit bir çözümdür değil orada.
Lukas Liesis

Mesajımın genelleştirilmesiyle ilgili yan etkilerle ilgili iyi yanıtlar gelmeli ve eksiksiz olmalıdır, ancak kabuk komut dosyaları genellikle neyin bulunup bulunmadığını ve neyin harekete geçilip neyin harekete geçirilmediğini bilmek istemektedir.
uchuugaka

rm /p/a/t/h 2> /dev/nullecho $?dosya yoksa dönüş kodunu ( ) 0 olarak tutmaz. Bu, varolmayan bir dosyayı silmeye çalıştığımız için Jenkins'in bir tür işlerin başarısız olmasına neden olur.
ViFI

@uchuugaka - Bu yoruma uzunca bir süre yanıt vermekten kaçındım, ancak ele alınması gerekiyor. Dosyanın silinmeden önce var olup olmadığını kontrol etmek her zaman kötü bir fikirdir. Cevabımın son paragrafına bakınız. Bu tür bir şey yaparak kaçınılamayacak doğal bir yarış koşulu vardır. Varolan bir dosyanın üzerine yazmak istemiyorsanız, kabuğa özel bir sihir ( noclobberbash gibi ) deneyebilir veya mevcut dosyayı yeniden yönlendirebilirsiniz, böylece dosya varsa yönlendirme başarısız olur (yarış koşulundan kaçınmaz), ama tek yapacağım böcekleri daha incelikli yapmak.
William Pursell

127

Kullandığım başka bir satır komutu:

[ -e file ] && rm file

11
Veya alternatif olarak: [ ! -e dosya] || rm dosyası. Bu sürüm bazı hatalar yerine 0 döndürür.
nawfel bgh

@nawfelbgh Teşekkürler, bu daha uzun bir senaryoda zincirleme yapmak için harika.
Abe

83

Bunu kullanabilirsiniz:

#!/bin/bash

file="file_you_want_to_delete"

if [ -f $file ] ; then
    rm $file
fi

4
Bu seçilen cevap olmalıdır.
ingernet

Basit ve kolay okunur ve ayrıca echo $?dosya yoksa 1 vermez.
ViFI

Gerekirse, bunu tek astar olarak da yapabilirsiniz, aşağıdaki cevabımı görebilirsiniz.
nbeuchat

65

Dosyanın var olup olmadığını kontrol etme adımını göz ardı etmek istiyorsanız, oldukça kolay bir komut kullanabilirsiniz; bu, eğer varsa dosyayı siler ve mevcut değilse bir hata atmaz.

 rm -f xyz.csv

1
Bu, 2015'ten itibaren en yüksek puan alan cevabın sadece bir kopyası.
forgivenson

16
ana cevap onunla -fbir hata atmayacağını açıklamıyordu. Bu cevap bana yardımcı oldu, teşekkürler.
Doug

Bu, bir yanıtın wiki benzeri bir düzenlemesi için iyi bir kullanım örneği gibi görünse de Doug ile aynı fikirde olun.
Philip

16

Bir dosyayı zaten varsa kaldırmak için bir liner kabuk komut dosyası (Jindra Helcl'ın cevabına dayanarak):

[ -f file ] && rm file

veya bir değişkenle:

#!/bin/bash

file="/path/to/file.ext"
[ -f $file ] && rm $file

13

Böyle bir şey işe yarayabilir

#!/bin/sh

if [ -fe FILE ]
then 
    rm FILE
fi 

-f normal bir dosya olup olmadığını kontrol eder

-e dosyanın var olup olmadığını kontrol eder

Daha fazla bilgi için if'a giriş

EDIT: -e ile kullanılan -f gereksizdir, -f tek başına kullanıldığında da çalışmalı


-akullanımdan kaldırılmışsa -ebunun yerine kullanın.
mziccard

benim kötü, sabit. Thanks @mziccard
P1kachu

bu, dizinlere, bağlantılara veya diğer normal olmayan dosyalara hatalar atar. Kullanmak daha iyi / daha güvenli imho -f.
Jindra Helcl

1
tamam. yine -ede -fe, gereksiz olduğunu, aynı -fzamanda bildiğim kadarıyla dosyanın varlığını kontrol eder ..
Jindra Helcl


4

if [ $( ls <file> ) ]; then rm <file>; fi

Ayrıca, çıktınızı >bunun yerine yeniden yönlendirirseniz >>önceki dosyanın üzerine yazılır


3
bu bir astar değil, üzgünüm ama @liwp_Stephen olanı bu.
fiorentinoing

Düzgün aktarılmış olsa bile, bu file bir şey5 -lt 2
William Pursell
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.