Kosongkan isi file

220

Saya mengetahui tiga metode untuk menghapus semua entri dari file.

Mereka

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

Dari ketiga ini saya >filenamepaling banyak menyalahgunakan karena membutuhkan paling sedikit penekanan tombol.

Namun, saya ingin tahu mana yang paling efisien dari ketiganya (jika ada metode yang lebih efisien) sehubungan dengan file log besar dan file kecil.

Juga, bagaimana ketiga kode beroperasi dan menghapus konten?

debal
sumber
24
Bagaimana dengan truncate -s 0 filename?
Martin Thoma
Sangat mirip dengan Perbedaan antara kucing dan '>' untuk membidik file di mana Anda akan menemukan informasi lebih lanjut.
Stéphane Chazelas
Yang pertama hanya akan berfungsi jika dipanggil dari bash command line, tetapi tidak akan berfungsi jika dieksekusi dalam file .sh
Marco Marsala
8
sentuh tidak menghapus konten, tetapi mengubah waktu akses pada file. Itu membuat file kosong jika tidak ada.
hbogert

Jawaban:

293

Sebenarnya, bentuk kedua touch filenametidak menghapus apa pun dari file - itu hanya membuat file kosong jika tidak ada, atau memperbarui tanggal modifikasi terakhir dari file yang ada.

Dan yang ketiga filename < /dev/nullmencoba menjalankan nama file dengan /dev/nullsebagai input.

cp /dev/null filename bekerja.

Adapun yang efisien, yang paling efisien adalah truncate -s 0 filename; lihat di sini: http://linux.die.net/man/1/truncate .

Kalau tidak, cp /dev/null filenameatau > filenamekeduanya baik-baik saja. Keduanya membuka dan kemudian menutup file, menggunakan pengaturan truncate-on-open. cpjuga terbuka /dev/null, sehingga membuatnya sedikit lebih lambat.

Di sisi lain, truncatekemungkinan akan lebih lambat daripada > filenameketika dijalankan dari skrip karena menjalankan perintah truncate membutuhkan sistem untuk membuka file yang dapat dieksekusi, memuatnya, dan menjalankannya.

Abu
sumber
9
Jadi mengapa Anda mengatakan itu truncateyang paling efisien?
Stéphane Chazelas
7
Operasi terpotong menggunakan panggilan sistem ftruncate () atau truncate () yang tidak mengganggu untuk membuka file. Ini juga menghindari panggilan sistem close () yang perlu dipanggil oleh cp dan > filenamemetode.
abu
3
Sebenarnya, itu (setidaknya GNU satu) melakukan buka + ftruncate + tutup (di samping banyak sistem panggilan itu untuk memuat dan menginisialisasi sendiri), karena bagaimanapun, itu harus membuat file jika tidak ada dan truncate(2)tidak melakukan itu.
Stéphane Chazelas
Jika kita menggunakan touch filename, apakah inode akan tetap sama (asalkan ada file sebelumnya)?
pMan
1
@man ya, Anda dapat mencobanya dan periksa denganls -i
terdon
43

Pilihan lain bisa:

echo -n > filename

Dari halaman manual dari echo:

-n Do not print the trailing newline character.

Arturo Herrero
sumber
Bagaimana saya bisa mengatur ukuran? Katakan jika saya ingin 30000 karakter null?
Pengguna
3

Ada perintah builtin ":", yang tersedia di sh, csh, bash dan lainnya, yang dapat dengan mudah digunakan dengan operator keluaran pengarah >memotong file:

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

Yang saya suka dari ini adalah, bahwa itu tidak memerlukan perintah eksternal seperti "echo" dll.

Satu keuntungan besar dari pemotongan file daripada membuat ulang / membuatnya kembali adalah, bahwa menjalankan aplikasi yang bekerja dengan file ini (misalnya seseorang membuat tail -f filenameatau perangkat lunak pemantauan, ...) tidak harus membukanya kembali. Mereka hanya dapat terus menggunakan deskriptor dan mendapatkan semua data baru.

Mirko Steiner
sumber
man bashmenggambarkan :shell builtin tidak memiliki efek.
Haxiel
Ya, dan Anda mengarahkan ini dengan >ke file, yang membuat file jika tidak ada, dan jika ada Anda memotongnya ke nol. Lebih baik mengatakan: Anda menggunakan :untuk tidak melakukan apa pun, dan gunakan >untuk mengalihkan apa pun ke file, dan memotongnya.
Mirko Steiner
1
Kenapa kamu ingin melakukan itu? > filesudah cukup untuk memotong file. Anda tidak memerlukan perintah apa pun, hanya operator pengalihan.
terdon
1
terkadang, > filenametidak akan berhasil. misalnya, dalam zsh. tetapi : > filenamemasih bekerja.
CS Pei
Bash dan sh tampaknya menyukai > myfiletetapi mis. Kesalahan csh dengan: Perintah null tidak valid.
Mirko Steiner