Bir dosyanın içeriğini boşalt


220

Bir dosyadaki tüm girdileri silmek için üç yöntemden haberdarım.

Onlar

  • >filename
  • touch filename
  • filename < /dev/null

Bu üçünden >filename, en az sayıda tuşa basılmasını gerektiren en çok suistimal ediyorum .

Bununla birlikte, büyük günlük dosyalarına ve küçük dosyalara göre, üçünün hangisinin daha verimli olduğunu (daha verimli yöntemler varsa) bilmek istiyorum.

Ayrıca, üç kod içeriği nasıl işler ve siler?


24
Ne hakkında truncate -s 0 filename?
Martin Thoma


İlki yalnızca bash komut satırından çağrıldığında çalışır, ancak .sh dosyasında çalıştırıldığında çalışmaz
Marco Marsala

8
dokunma içeriği silmez, ancak dosyadaki erişim süresini değiştirir. It does oluşturmak hiçbiri var olsaydı boş bir dosya.
hbogert 28:16

Yanıtlar:


293

Aslında, ikinci form touch filenamedosyadan hiçbir şey silmez - yalnızca mevcut değilse boş bir dosya oluşturur veya varolan bir dosyanın son değiştirilme tarihini günceller.

Üçüncüsü filename < /dev/null, dosya adını /dev/nullgirdi olarak çalıştırmaya çalışır .

cp /dev/null filename Eserleri.

Verimli gelince, en verimli olacaktır truncate -s 0 filename; buraya bakınız: http://linux.die.net/man/1/truncate .

Aksi takdirde, cp /dev/null filenameveya > filenameher ikisi de iyidir. Her ikisi de açılır ve ardından açma-kapama ayarını kullanarak dosyayı kapatır. cpayrıca açılır /dev/null, böylece marjinal yavaşlar.

Öte yandan, truncate komutunu çalıştırmak sistemin çalıştırılabilir dosyayı açmasını, yüklemesini ve çalıştırmasını gerektirdiğinden, bir komut dosyasından çalıştırılmasından truncatedaha yavaş olacaktır > filename.


9
Peki neden truncatebunun en verimli olduğunu söylüyorsunuz ?
Stéphane Chazelas

7
Kesme işlemi, dosyayı açmak için uğraşmayan ftruncate () veya truncate () sistem çağrısını kullanır. Ayrıca, cp ve > filenameyöntemlerin çağırması gereken close () sistem çağrısını da engeller .
kül

3
Aslında, (en azından GNU olanı) bir open + ftruncate + close yapar (birçok sisteme ek olarak kendisini yüklemek ve başlatmak ister), yine de, mevcut değilse dosyayı oluşturmak zorunda kalır. ve truncate(2)bunu yapmaz.
Stéphane Chazelas

Kullandığımız takdirde touch filename, inode aynı kalır (bir dosya önce orada koşuluyla) olacak?
pMan,

1
@pMan evet, deneyip kontrol edebilirsinizls -i
terdon

43

Diğer seçenek olabilir:

echo -n > filename

Man sayfasından echo:

-n Do not print the trailing newline character.


Boyutu nasıl ayarlayabilirim? 30000 boş karakter istiyorsam söyleyelim mi?
Kullanıcı

3

":" Belki sh csh, bash mevcuttur ve diğerleri, kolayca yönlendirme çıkış operatörüyle kullanılabilen bir yerleşik komutu vardır >bir dosyayı kesecek:

#!/usr/bin/env bash
:> filename

Bundan hoşlandığım şey, "echo" vb. Gibi harici komutlara ihtiyaç duymamasıdır.

Dosyalarını kısaltmak / yeniden oluşturmak yerine kesmenin büyük bir avantajı, bu dosyayla çalışan uygulamaları çalıştırmak (ör. Birisi bir tail -f filenameveya bir izleme yazılımı yapar , ...) yeniden açmak zorunda değildir. Dosya tanıtıcısını kullanmaya devam edebilirler ve tüm yeni verileri alırlar.


man bash:Kabuk yapısının etkisiz olduğunu açıklar .
Haxiel

Evet, ve >eğer varsa, dosyayı varsa dosyaya yönlendirirsiniz , eğer varsa ve onu sıfıra indirirsiniz. Daha iyi dedi: :hiçbir şeyi yapmak için kullanmazsınız >ve hiçbir şeyi bir dosyaya yönlendirmek için kullanmazsınız ve onu kesersiniz.
Mirko Steiner

1
Neden bunu yapasın? > filebir dosyayı kesmek için yeterli. Herhangi bir komuta ihtiyacınız yok, sadece yönlendirme operatörü.
terdon

1
bazen > filenameişe yaramaz. örneğin, zsh. ama : > filenamehala çalışıyor.
CS Pei

Bash ve sh gibi görünüyor > myfileama örneğin ile csh hataları: Geçersiz boş komut.
Mirko Steiner,
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.