Metin dosyasının içeriğini boşaltma


16

Ana dizinimde düzenli olarak bir cron işi aracılığıyla veri alan bir metin dosyası var. Cron işi dinamik veriler sağladığından, dosya içeriğini boşaltmak için bir cron işi de ayarlamak istiyorum (dosya hala var olmalıdır). Cron ile ilgili yardıma ihtiyacım yok, sadece dosyayı boşaltmaya yardımcı olabilecek komut.


5
Alternatif: tail -n +1000 file.txt > file.txt1000 satırı kaldırmalı ve dosyadaki en yeni satırları saklamalıdır (bir şeyi izlemek için son kayıtlardan bazılarına ne zaman ihtiyacınız olabileceğini asla bilemezsiniz).
Rinzwind

2
Bu aslında dosyayı planlanan zamanlarda temizlemekten daha iyi bir seçenektir.
Bruno Pereira

1
@Rinzwind, kuyruk okumaya çalışmadan önce dosya kesileceğinden bu işe yaramaz. Yeni bir dosyaya yönlendirmeniz ve orijinali yenisiyle değiştirmeniz gerekir.
psusi

Gerçek @ psusi :) orada ekstra bir yönlendirme olması gerekiyor.
Rinzwind

Yanıtlar:


28

En basit yol:

> filename

Bu, daha az belirgin bir yol ve muhtemelen başkaları tarafından bir kabuk komut dosyasında daha az okunabilir, ancak ihtiyacınız olan her şey.

Çünkü >aslında gerçekten komut değil sen kullanamazsınız (Bu bash yerleşiğidir):

sudo > filename

bu dosyada izinleriniz olmadığında. Ancak şunları kullanabilirsiniz:

sudo bash -c "> filename"

izin reddedildi diyor çünkü ne tür izinler değiştirilmesi gerekiyor, ben zaten dosyaya chmod 755 yaptım, ya da ben yeni bir Yazı yapmak (i ​​izin soruları demek)
sosytee

@sosytee Yeni düzenlemelerimi gör.
Radu Rădeanu

1
@sosytee Tabii ki yapabilirsiniz, ancak sudo crontab -ecron işini kök için eklemek için kullanın , sizin için değil. Veya 755 değil, 766 (veya 666) dosya izni değiştirin: sudo chmod 766 filename. Hakkında daha fazla bilgi: codex.wordpress.org/Changing_File_Permissions
Radu Rădeanu

1
truncate filenameboş çıktıyı dosyaya yönlendirmekten biraz daha temiz ve basittir ve problemlerle karşılaşmaz sudo.
psusi

1
@psusi truncate -s 0 filenamegerçekten hile yapabilir. Cevap olarak ekleyebilirsiniz.
Radu Rădeanu

19

Bu amaçla oluşturulmuş bir araç var:

truncate -s 0 filename

Bu içeriği temizler, ancak yine de aynı dosya olur ( inode aynı kalır).

Bu önemlidir, çünkü bazı programlar "inode" dosyasına bir tanıtıcı sahiptir. Diyelim ki dosyayı silmek ve yeniden oluşturmak için naif yöntemini kullanarak bir dosyayı "boşalttığınızı" varsayalım. Bazı programlar, normal dosya gibi artık görünür olmasa bile, eski dosyaya (eski içeriğe sahip) sahip olabilir ls.

Bu cevabın sonunda daha fazla ayrıntıya bazı bağlantılar.


Başka bir yol, hatırlanması belki daha kolay:

echo -n > filename

Bu aynı inode tutar.

Her iki Not truncateve echo -ntanımlanmamış POSIX'deki .

POSIX uyumluluğu için cat /dev/null:

cat /dev/null > filename

Yine başka bir yol, daha belirsiz ve muhtemelen kabuk agnostik değil:

> filename

Kesilecek dosyanın yazmak için kök ayrıcalıklara ihtiyacı varsa, aşağıdaki satırlar beklendiği gibi çalışmaz:

sudo echo -n > filename
sudo cat /dev/null > filename
sudo > filename

Bunun nedeni, yönlendirme sudo yürütülmeden önce bile kabuk tarafından yapılır. Bu, dosyaya yazma erişiminin, sudo tarafından verilen ayrıcalıklar değil, kabuğu çalıştıran kullanıcının ayrıcalıkları kullanılarak yapıldığı anlamına gelir.

Geçici çözüm, şunun gibi sudo ayrıcalıkları kullanılarak yürütülen bir kabuğa yönlendirmeyi ertelemektir:

sudo sh -c "echo -n > filename"

Kullanılması truncateyazma erişim kabuk tarafından yapılmazsa, çünkü böyle bir çözüm gerekmez ama tarafından truncatehangi sudo ayrıcalıkları kullanarak sudo tarafından yürütülür.

sudo truncate -s 0 filename

Dosya silinmiş olsa bile dosyayı açık tutan programlarla ilgili bazı ayrıntılar için aşağıdakileri okuyabilirsiniz:


diyor ki İzin reddedildi, chmod 755 dosya adı kullanıldı, ancak yine de izin reddedildi
sosytee

2
belki bash'de noclobber etkin mi?
lesmana

Şimdiye kadarki en eksiksiz cevap
AbdelHady

4

Bunu otomatikleştirmek için logrotate kullanabilirsiniz. Boşaltmak istediğiniz dosya için bir yapılandırma dosyası oluşturun, başka ayarlar ekleyin ve her gün seçtiğiniz ölçütlere göre veya dosya daha büyük olduğunda otomatik olarak her gün boş bırakabilirsiniz.

Logrotate'i nasıl yapılandıracağınıza buradan bir göz atın: http://linuxcommand.org/man_pages/logrotate8.html


1
Bu seçeneği kendim tercih ederim. Biz "file> 10 Mb" -> "tar.gz it" "boş dosyayı" yedeklemek için kullanırız. Ve yedeklemeler 900 gün sonra silinir.
Rinzwind

3

echo "" > foo_filebunu yapmanın basit bir yoludur, foo_file dosyasının tüm içeriğini "" ile değiştirir ve bu durumda boş bırakır .

Ayrıca cat /dev/null > foo_file, null aygıtı okuyacak ve dosyanızın üzerine hiçbir şey yazmadan yazacaksınız.


izin reddedildi, chmod 755 dosya adı kullandığını ancak yine de izin reddedildiğini
söylüyor

Lütfen normal kullanıcılarınızla dosya izinlerini okuyabilir misiniz?
Bruno Pereira

evet içeriği normal kullanıcı olarak okuyabilirim
sosytee
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.