Bagaimana cara menghapus konten file dari baris perintah?


280

Saya memiliki file log yang memiliki banyak hal di dalamnya yang tidak saya perlukan lagi. Saya ingin menghapus isinya.

Saya tahu cara mencetak konten ke layar:

cat file.log

Saya tahu cara mengedit file, baris demi baris:

nano file.log

Tetapi saya tidak ingin menghapus setiap baris satu per satu. Apakah ada cara untuk melakukannya dalam satu perintah tanpa merusak file untuk melakukannya?

Jawaban:


466

Dalam bash, adil

> filename

akan melakukan.

Ini akan meninggalkan Anda dengan nama file file kosong .

ps

Jika Anda perlu sudomenelepon, harap pertimbangkan untuk menggunakan truncatesebagaimana dijawab di sini .


57
Ini mungkin perintah raddest dalam sejarah komputasi
blarg

7
Sebaliknya, @ Arekkusandaa.Irujasukin; ini berfungsi dengan baik di semua versi Windows, selama, seperti yang disebutkan, Anda menggunakan bashsebagai shell Anda dan bukan eg cmd.exeatau PowerShell, yang keduanya tidak cukup POSIXy diharapkan untuk menangani hal-hal seperti itu.
DopeGhoti

124

Anda dapat menggunakan perintah pengguna: truncate

truncate -s 0 test.txt

("-s 0" untuk menentukan ukuran)

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


3
Jawaban terbaik sekitar, berfungsi saat Anda non-root (dengan sudo) - sudo echo > filehanya memberikan kesalahan dalam kasus seperti itu.
Dmitry Verkhoturov

12
@DmitryVerkhoturov: sudo bash -c '> filename'adalah bagaimana Anda menggunakan solusi Bash dengan sudo.
Stuart P. Bentley

1
brew install truncatepada os x dengan homebrew diinstal.
xaxxon

Bekerja lebih cepat daripada gema
Miao1007

34

Anda bisa melakukan ini:

echo -n "" > file.log

Menggunakan >untuk menulis input (null) dari echo -nke file.

Menggunakan >>akan menambahkan input nol ke file (secara efektif tidak melakukan apa pun kecuali touchitu).


Ini akan meninggalkan ruang di sana.
dmckee

Saya mendapatkan ini: -bash:: perintah tidak ditemukan
Andrew

3
echo ""> masih akan memberi Anda file dengan satu karakter (baris baru.) Jika Anda ingin menggunakan echo, gunakan "echo -n> file.log" untuk echo null.
Dave Forgac

Akan lebih baik menggunakan perintah null-output khusus seperti true(atau alias bawaannya :), meskipun pada akhirnya Anda tidak memerlukan perintah sama sekali (lihat jawaban yang diterima).
Stuart P. Bentley

Anda mungkin memiliki beberapa masalah dengan sudo.
flapjack

27
: > file.log

Sama seperti > filenamedi Bash, tetapi bekerja di lebih banyak kerang (kredit) . Redirect output dari truebuiltin (yang tidak memiliki output) ke filename.


Saya datang untuk membuat jawaban ini, tetapi sayangnya sudah ada di sini ... Terima kasih.
Aaron Hall

5
Lakukan saja :> filename. Bukankah itu terlihat seperti tersenyum? :>
minmaxavg

10

ZSH

>! filename

ZSH akan melindungi pengguna dari clobbering file menggunakan operator pengalihan io >. Jika Anda menggunakan, >!Anda dapat memaksa pemotongan file yang ada.

Jika Anda ingin ZSH menggunakan perilaku pengalihan Bash, jika tidak ada perlindungan dari clobbering file, maka Anda perlu mengatur clobberopsi untuk shell Anda.

Info Lebih Lanjut: http://zsh.sourceforge.net/Doc/Release/Redirection.html


8

JIKA Anda ingin melakukan dari dalam editor vim di baris perintah, Anda dapat mencoba ini:

vim file.txt 

Tekan Esc.

:1,$d

Tekan Enter.

Anda akan menemukan semua baris dihapus.


Ini adalah satu-satunya hal yang bekerja untuk saya maillog, bahkan sudo > /var/log/maillogtidak akan menghapusnya (izin ditolak)
bobobobo

2
@obobobo Ini tidak berfungsi sebagai sudo > /var/log/maillogalat - jalankan sudo, dan masukkan hasilnya ke file. Jelas itu menempatkan output dengan izin pengguna saat ini. Hal yang lebih mudah dilakukan sudo suuntuk memulai shell root dan kemudian lakukan > /var/log/maillog.
kan

4
$ rm file.log; touch file.log

atau

$ cat > file.log

diikuti oleh control-d.

atau ... atau ... atau ...

Ah. Ini adalah versi perintah tunggal:

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

2
Saran Thechickenmoo echo "" > file.loglebih baik daripada catopsi yang Anda tunjukkan, dalam situasi ini, ada yang lain catyang lebih tepat. keduanya menggunakan pengalihan shell yang sama untuk melakukan pengangkatan berat.
quack quixote

2
Anda tidak perlu menjalankan perintah cat. Hanya "> file.log" akan melakukannya.
camh

Menghapus file akan mengatur ulang tanggal pembuatan.
Matteo

Menghapus file akan menyebabkan program menonton file tersebut kehilangan pointer ke sana (yaitu, itu akan memiliki alamat baru di sistem file). Secara umum, ya rmakan menyelesaikan tugas menghasilkan file kosong dengan nama yang sama. Tapi itu tidak akan tepat untuk setiap kasus penggunaan.
robert



1

Beberapa alternatif:

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

1

Jika Anda memiliki spasi dalam nama file, gunakan:

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

(Saya tidak dapat memasukkannya ke dalam komentar untuk jawaban sebelumnya karena saya tidak memiliki reputasi 50. Terkadang keterbatasan bersifat kontra-produktif.)


0

Satu baris sekaligus?

Coba vi (m), editor teks cantik yang bisa melakukan apa saja. Dalam hal ini, navigasikan ke sebuah saluran, tekan d (untuk menghapus), dan d lagi (untuk saluran).


5
Jika Anda ingin menyingkirkan seluruh file dalam vim, dengan kursor di bagian atas dokumen, ketikkan d G (itu d, maka shift-G) akan menghapus seluruh file (d untuk menghapus, G untuk akhir dari mengajukan). Saya lebih suka metode Anda, meskipun (memberi saya lebih banyak waktu untuk berpikir apakah saya BENAR-BENAR ingin membuang file).
Babu

@Babu ggbergerak ke atas sehingga seluruh urutan bisa terjadi ggdG.
Bob

0

Dengan izin saya ini adalah satu-satunya hal yang berhasil:

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

0

Juga, jika Anda memiliki banyak file, Anda dapat menggunakan yang berikut ini:

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

Ini bermanfaat untuk file log di direktori yang sama.


0

> a.txt

Sama seperti> nama file di Bash, tetapi berfungsi di lebih banyak shell (kredit). Redirect output dari builtin yang sebenarnya (yang tidak memiliki output) ke nama file.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.