Linux üzerinde zaten var olan ve bir şekilde korunan bir dosya nasıl boşaltılır ("kesilir")?


113

Sunucumda sık sık kısaltmam gereken error.log adında bir dosya var. Dosya için rw izinlerim var. Dosyayı vi'de açmak> ​​tüm içeriği silmek> işleri kaydetme (tabii ki). Ama aşağıdakileri denediğimde

cat /dev/null > error.log

Mesajı aldım

File already exists.

Açıkçası, dosyaların yanlışlıkla geçersiz kılınmasını önlemek için sunucuda yapılan bir tür yapılandırma vardır. Dosyayı tek bir komutla nasıl "keseceğimi" bilen var mı?


2
Korumasız bir dosya için kes -s 0 dosyası çalışır.
Pramod

Yanıtlar:


158

noclobberSeçenek setine sahipsiniz . Hata csh kaynaklı gibi görünüyor, bu yüzden yaparsınız:

cat /dev/null >! file

Yanılıyorsam ve bash kullanıyorsanız, yapmalısınız:

cat /dev/null >| file

bash'da, bunu şu şekilde de kısaltabilirsiniz:

>| file

Kabuğun csh olduğu konusunda haklısın. Bunu nasıl bildin?
Sumeet Pareek

6
@Wikidkaka - hata mesajına göre. Sistemimdeki csh benzer File existshatayı verirken, bash çok farklı bir cannot overwrite existing filehata veriyor .
R Samuel Klatchko

6
@Jarmund - kullanıcının noclobber ayarı olduğundan >fileçalışmıyor.
R Samuel Klatchko

Arasındaki fark nedir > fileve >| file?
Will

1
@Will - Eğer noclobberseçenek setiniz varsa, mevcut bir dosyaya yönlendirmeye çalışmak başarısız olur. >|
Noclobber'ı

71

Ayrıca işlev kesmeyi de kullanabilirsiniz

$truncate -s0 yourfile

izin reddedilirse, sudo kullanın

$sudo truncate -s0 yourfile

Yardım / El Kitabı: man truncate

ubuntu Linux üzerinde test edildi


1
truncate ayrıca dosyanın değişiklik zamanına dokunur - dosya değiştirilmezse "> dosya" öğesine dokunmaz.
dsteinkopf

Dosyanın tuttuğu disk alanını serbest bırakmaz. İlk başta 0 baytı gösterir. Ancak bu dosyaya bir şey yazdığınızda, dosya boyutu = kesmeden önce + yeni veri boyutu olur.
Aniket Kulkarni

48

Bu, dosya boyutunu 0 olarak ayarlamak için yeterli olacaktır:

> error.log

6
aslında, bu noclobber ile çalışmaz (kendim test ettim), bu nedenle bu durumda geçerli bir çözüm DEĞİL ("-bash: error.log: mevcut dosyanın üzerine yazılamaz"); Yukarıdaki komuta bakın ("@Jarmund - çünkü kullanıcı noclobber ayarına sahip,> dosya çalışmıyor."). Merak ediyorum, ne tür "zeki insanlar" bunun gibi bariz bir şekilde yanlış yanıtları

9

kredi bunun için kıdemli meslektaşım için geçerli:

:> filename

Bu, günlük dosyalarını bozmaz, böylece onu örneğin syslog'da bile kullanabilirsiniz.


8
Lütfen açıkla. O nasıl çalışır? Bu gösterim ne yapıyor?
user31986

2
@ user31986 :etkisiz bir komuttur (neredeyse bir yorum), sonra >her zamanki gibi yeniden yönlendirmedir, bu nedenle bu, dosyaya hiçbir şey yapmayan bir komuttan çıktı eksikliğini yeniden yönlendirir. Eğer noclobber etkinleştirilmişse, :>| filename(bash) 'a ihtiyacınız vardır (ve :>! filenamecsh'de csh olduğunu varsayarak varsayıyorum :).
Rhubbarb

4

false | tee fileToTruncate

de çalışabilir


Bu çok aptalca. Ya da bu yararlıysa, belirsiz bir ddşekilde hiçbir şeyin çıktısını almak düz okunabilir olandan daha iyi olmaz falsemı?
2016, 06:29

2

Sudo yeniden yönlendirme ile çalışmayacağından >, teebu amaca yönelik komutu beğendim

echo "" | sudo tee fileName

aslında bağladığınız soruda ve yukarıda anlatıldığı gibi öyle. "sudo sh -c '> error.log'" ...

hedef dosyadaki izinlere bağlıdır error.log, eğer bu zaten yazılabilirse, sudo'ya gerek yoktur. Sanırım diğer sorun, komutu dize argümanı olarak sh
iletiyorsunuz

1
Bu aslında dosyayı kesmez, çünkü echo ""yeni bir satır ekleyecektir. echo -n ""
Satırsonunu

0

Linux sistemindeki herhangi bir dosyayı kesmek için herhangi biri bu komutu deneyebilir

Bu kesinlikle herhangi bir formatta çalışacaktır:

truncate -s 0 file.txt


-4

Ayrıca deneyebilirsiniz:

echo -n > /my/file


8
Bir ton oyla cevabı görüyor musunuz? Okumaya çalışın ve yukarı bakın noclobberve ardından kendinize cevabınızın mantıklı olup olmadığını sorun.
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.