Bir dosyanın içeriği komut satırından nasıl temizlenir?


279

Artık ihtiyacım olmayan bir sürü şey olan bir günlük dosyasına sahibim. İçeriği silmek istiyorum.

İçeriği ekrana nasıl yazdıracağımı biliyorum:

cat file.log

Dosyayı satır satır nasıl düzenleyeceğimi biliyorum:

nano file.log

Ancak her satırı teker teker silmek istemiyorum. Bunu yapmak için dosyayı tahrip etmeden tek komutla yapmanın bir yolu var mı?

Yanıtlar:


464

Bash, sadece

> filename

yapacağım.

Bu boş bir dosya adı ile sizi bırakacaktır .

ps

Eğer gerekiyorsa sudoçağırın kullanmayı düşünün lütfen truncateolarak burada cevap .


57
Bu muhtemelen bilgi işlem tarihindeki raddest komut
blarg

7
Aksine, @ Arekkusandaa.Irujasukin; Bu, herhangi bir Windows sürümünde gayet iyi çalışır, belirtildiği bashgibi, kabuğunuzu kullandığınız sürece ve bunların cmd.exeya da bu tür işlemlerin yapılması beklenebilecek POSIXy olan PowerShell'i kullanmazsınız.
DopeGhoti

124

User komutunu kullanabilirsiniz: truncate

truncate -s 0 test.txt

(boyutu belirtmek için "-s 0")

http://www.commandlinefu.com/commands/view/12/empty-a-file


3
Etrafınızdaki en iyi cevap, root olmadığınızda çalışır (sudo ile) - sudo echo > filesadece bu gibi durumlarda hata verir.
Dmitry Verkhoturov

12
@DmitryVerkhoturov: sudo bash -c '> filename'Bash çözümlerini sudo ile kullanma şeklinizdir .
Stuart P. Bentley

1
brew install truncateos x üzerinde homebrew kurulu.
xaxxon


34

Bunu yapabilirsin:

echo -n "" > file.log

>(Null) girişini echo -ndosyaya yazmak için kullanılır .

Kullanılması >>olacağını eklemek dosyaya boş girişi (etkili hiçbir şey yapmadan ama touchbunu ing).


Bu orada bir boşluk bırakacaktır.
dmckee

Bunu alıyorum: -bash:: komut bulunamadı
Andrew

3
echo ""> hala bir karakterli (yeni satırlı) bir dosya verir. echo kullanmak istiyorsanız, echo null işlevini kullanmak için "echo -n> file.log" kullanın.
Dave Forgac

Nihayetinde bir komuta ihtiyacınız olmasa trueda (veya yerleşik takma adı :) gibi özel bir null-çıktı komutu kullanmak daha iyi olacaktır (kabul edilen cevaba bakınız).
Stuart P. Bentley

Bazı problemleriniz olabilir sudo.
flapjack

27
: > file.log

> filenameBash ile aynı , ancak daha fazla mermide çalışıyor (kredi) . Çıkışı trueyerleşikten (çıktısı olmayan) adresine yönlendirir filename.


Bu cevabı vermeye geldim, ama ne yazık ki zaten burada ...
Aaron Hall

5
Sadece yap :> filename. Bir surat gibi görünmüyor mu? :>
minmaxavg

10

ZSH

>! filename

ZSH, io redirect operatörünü kullanarak kullanıcıları dosyalara karşı koruyacaktır >. Eğer kullanırsanız >!, varolan bir dosyanın kesme zorlayabilir.

ZSH'nin Bash'in yeniden yönlendirme davranışını kullanmasını istiyorsanız, dosya gizlenmesinden korunma olmadıysa, clobberkabuğunuz için seçeneği ayarlamanız gerekir .

Daha Fazla Bilgi: http://zsh.sourceforge.net/Doc/Release/Redirection.html


8

Komut satırında bir vim editörünün içinden yapmak istiyorsanız, şunu deneyebilirsiniz:

vim file.txt 

Tuşuna basın Esc.

:1,$d

Tuşuna basın Enter.

Silinen tüm satırları göreceksiniz.


Bu benim için çalışmış tek şey maillogbile, sudo > /var/log/maillog(izin reddedildi) temizlemek olmaz
bobobobo

2
@bobobobo Bu sudo > /var/log/maillogaraç olarak çalışmıyor - sudo çalıştırın ve çıktıyı dosyaya yerleştirin. Açıkçası mevcut kullanıcı izinleriyle çıktıyı veriyor. sudo suKök kabuk başlatmak için daha kolay bir şey yapmak ve sonra yapmak > /var/log/maillog.
kan

4
$ rm file.log; touch file.log

veya

$ cat > file.log

izledi control-d.

ya ... ya ... ya ...

Ah. İşte tek bir komut sürümü:

$ dd if=/dev/null of=file.log

2
Thechickenmoo'nun önerisi, echo "" > file.loggösterdiğiniz catseçeneğinden daha iyidir, bu durumda, catdaha uygun olan başka yerler de vardır . her ikisi de ağır kaldırma yapmak için aynı kabuk yönlendirmesini kullanır.
quack quixote

2
Cat komutunu çalıştırmanıza gerek yoktur. Sadece "> file.log" yapacak.
camh

Dosyayı kaldırmak oluşturma tarihini sıfırlar.
Matteo,

Dosyanın kaldırılması, o dosyayı izleyen programların işaretleyicisini kendisine kaybetmesine neden olacaktır (yani, dosya sisteminde yeni bir adresi olacaktır). Genel olarak, evet rm, aynı isimde boş bir dosya oluşturma görevini yerine getirecektir. Ancak her kullanım durumu için doğru olmayacak.
robert



1

Birkaç alternatif:

ex +%d -scwq file.log
cp /dev/null file.log
vi +%d -escwq file.log
install -m600 /dev/null file.log

1

Dosya adlarında boşluk varsa, şunu kullanın:

for file in /path/to/file/*; do > "$file"; done

(Önceki cevaba yorumlara dahil edemedim çünkü 50 itibarım yok. Bazen sınırlamalar tersine üretken olabilir.)


0

Bir seferde bir satır mı?

Her şeyi yapabilen sevimli metin editörü vi (m) 'yi deneyin. Bu durumda, bir satıra gidin, d (silmek için) ve d (tekrar) için tekrar basın.


5
Eğer vim'deki tüm dosyadan kurtulmak istiyorsanız, imleç belgenin üstündeki imleçle birlikte, d G (bu durumda d, sonra shift-G) yazdığınızda tüm dosya silinir (silmek için d, G sonunda dosya). Yine de, yönteminizi tercih ediyorum (bu, gerçekten GERÇEKTEN dosyayı çöpe atmak isteyip istemediğim hakkında düşünmek için daha fazla zaman veriyor).
Babu

@Babu ggen üste hareket eder, böylece tüm sekans olabilir ggdG.
Bob

0

İzinlerime göre bu işe yarayan tek şey:

touch temp.txt
sudo mv temp.txt original-file.txt

0

Ayrıca, birden fazla dosyanız varsa, aşağıdakileri kullanabilirsiniz:

for file in /path/to/file/*; do > $file; done

Bu, aynı dizindeki günlük dosyaları için yararlıdır.


0

> a.txt

Bash'deki> dosya adıyla aynıdır, ancak daha fazla kabukta çalışmaktadır (kredi). Çıktıyı gerçek yerleşikten (çıktısı olmayan) dosya adına yönlendirir.

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.