Saya mengetahui tiga metode untuk menghapus semua entri dari file.
Mereka
>filename
touch filename
filename < /dev/null
Dari ketiga ini saya >filename
paling 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?
shell-script
files
debal
sumber
sumber
truncate -s 0 filename
?Jawaban:
Sebenarnya, bentuk kedua
touch filename
tidak 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/null
mencoba menjalankan nama file dengan/dev/null
sebagai 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 filename
atau> filename
keduanya baik-baik saja. Keduanya membuka dan kemudian menutup file, menggunakan pengaturan truncate-on-open.cp
juga terbuka/dev/null
, sehingga membuatnya sedikit lebih lambat.Di sisi lain,
truncate
kemungkinan akan lebih lambat daripada> filename
ketika dijalankan dari skrip karena menjalankan perintah truncate membutuhkan sistem untuk membuka file yang dapat dieksekusi, memuatnya, dan menjalankannya.sumber
truncate
yang paling efisien?> filename
metode.truncate(2)
tidak melakukan itu.touch filename
, apakah inode akan tetap sama (asalkan ada file sebelumnya)?ls -i
Pilihan lain bisa:
Dari halaman manual dari
echo
:sumber
Ada perintah builtin ":", yang tersedia di sh, csh, bash dan lainnya, yang dapat dengan mudah digunakan dengan operator keluaran pengarah
>
memotong file: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 filename
atau perangkat lunak pemantauan, ...) tidak harus membukanya kembali. Mereka hanya dapat terus menggunakan deskriptor dan mendapatkan semua data baru.sumber
man bash
menggambarkan:
shell builtin tidak memiliki efek.>
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.> file
sudah cukup untuk memotong file. Anda tidak memerlukan perintah apa pun, hanya operator pengalihan.> filename
tidak akan berhasil. misalnya, dalam zsh. tetapi: > filename
masih bekerja.> myfile
tetapi mis. Kesalahan csh dengan: Perintah null tidak valid.