Mengosongkan isi file teks

16

Saya memiliki file teks di direktori rumah saya yang menerima data secara teratur melalui pekerjaan cron. Karena pekerjaan cron menyediakan data dinamis, saya juga ingin mengatur pekerjaan cron untuk mengosongkan isi file (file tersebut masih harus ada). Saya tidak perlu bantuan dengan cron, hanya perintah yang dapat membantu mengosongkan file.

sosytee
sumber
5
Alternatif: tail -n +1000 file.txt > file.txtharus menghapus 1000 baris dan menyimpan baris terbaru dalam file (Anda tidak pernah tahu kapan Anda mungkin memerlukan beberapa catatan terbaru untuk melacak sesuatu).
Rinzwind
2
Itu sebenarnya pilihan yang lebih baik daripada membersihkan file pada waktu yang dijadwalkan.
Bruno Pereira
1
@Rinzwind, itu tidak akan berfungsi karena file akan terpotong sebelum ekor mencoba membacanya. Anda perlu mengalihkan ke file baru, dan kemudian ganti yang asli dengan yang baru.
psusi
Benar @psusi :) perlu ada redirect tambahan di sana.
Rinzwind

Jawaban:

28

Cara paling sederhana:

> filename

Ini adalah cara yang kurang jelas dan mungkin kurang dapat dibaca dalam skrip shell oleh orang lain, tetapi hanya itu yang Anda butuhkan.

Karena >sebenarnya bukan perintah yang sebenarnya (ini adalah bash builtin) yang tidak dapat Anda gunakan:

sudo > filename

ketika Anda tidak memiliki izin pada file itu. Tapi Anda bisa menggunakan:

sudo bash -c "> filename"
Radu Rădeanu
sumber
izin seperti apa yang perlu diubah karena dikatakan izin ditolak, saya sudah melakukan chmod 755 ke file tersebut, atau haruskah saya membuatnya menjadi Posting baru (maksud saya pertanyaan izin)
sosytee
@sytytee Lihat hasil edit baru saya.
Radu Rădeanu
1
@sytytee Tentu saja Anda bisa, tetapi gunakan sudo crontab -euntuk menambahkan pekerjaan cron untuk root, bukan untuk Anda. Atau mengubah izin file untuk 766 (atau 666), tidak 755: sudo chmod 766 filename. Lebih lanjut tentang: codex.wordpress.org/Changing_File_Permissions
Radu Rădeanu
1
truncate filenamesedikit lebih bersih dan lebih sederhana daripada mengarahkan kembali output kosong ke file dan tidak mengalami masalah dengan sudo.
psusi
1
@psusi truncate -s 0 filenamememang bisa membuat trik. Anda dapat menambahkannya sebagai jawaban.
Radu Rădeanu
19

Ada alat yang dibuat untuk tujuan itu:

truncate -s 0 filename

Ini akan menghapus isinya tetapi masih berupa file yang sama ( inode tetap sama).

Ini penting karena beberapa program memegang pegangan pada file "by inode". Misalkan Anda "mengosongkan" file menggunakan metode naif menghapus dan membuat ulang file. Beberapa program mungkin masih menangani file lama (dengan konten lama) meskipun tidak lagi terlihat seperti biasa ls.

Beberapa tautan ke detail lebih lanjut di akhir jawaban ini.


Cara lain, mungkin lebih mudah diingat:

echo -n > filename

Ini juga menyimpan inode yang sama.

Perhatikan bahwa keduanya truncatedan echo -ntidak didefinisikan oleh POSIX .

Untuk penggunaan kepatuhan POSIX cat /dev/null:

cat /dev/null > filename

Namun cara lain, lebih tidak jelas dan mungkin tidak shell agnostik:

> filename

Jika file yang terpotong membutuhkan root untuk menulis maka baris berikut tidak akan berfungsi seperti yang diharapkan:

sudo echo -n > filename
sudo cat /dev/null > filename
sudo > filename

Ini karena pengalihan dilakukan oleh shell bahkan sebelum sudo dieksekusi. Itu berarti bahwa akses tulis ke file dilakukan menggunakan hak istimewa pengguna yang menjalankan shell, bukan hak istimewa yang akan diberikan oleh sudo.

Solusinya adalah untuk menunda pengalihan ke shell yang dieksekusi menggunakan hak akses sudo seperti ini:

sudo sh -c "echo -n > filename"

Menggunakan truncateAnda tidak perlu solusi seperti itu karena akses tulis tidak dilakukan oleh shell tetapi oleh truncateyang dijalankan oleh sudo menggunakan hak sudo.

sudo truncate -s 0 filename

Untuk beberapa detail berdarah tentang program yang menahan file terbuka walaupun file telah dihapus, Anda dapat membaca yang berikut:

lesmana
sumber
katanya Izin ditolak, telah menggunakan chmod 755 nama file tetapi izin masih ditolak
sosytee
2
mungkin Anda mengaktifkan noclobber di bash?
lesmana
Jawaban paling lengkap sejauh ini
AbdelHady
4

Untuk mengotomatisasi ini, Anda dapat menggunakan logrotate. Cukup buat file konfigurasi untuk file yang ingin dikosongkan, tambahkan pengaturan lain dan Anda dapat mengosongkannya setiap hari secara otomatis berdasarkan kriteria yang Anda pilih setiap hari, atau ketika file lebih besar dari dll.

Lihatlah di sini tentang cara mengkonfigurasi logrotate: http://linuxcommand.org/man_pages/logrotate8.html

piotrektt
sumber
1
Saya menyukai opsi ini sendiri. Kami menggunakan "file> 10 Mb" -> "tar.gz untuk membackup" "file kosong". Dan cadangannya bisa dihapus setelah 900 hari.
Rinzwind
3

echo "" > foo_fileadalah cara sederhana untuk melakukan itu, itu akan mengganti semua konten foo_file dengan "" membuatnya dalam kasus ini, kosong.

Anda juga dapat menggunakan cat /dev/null > foo_file, yang akan membaca perangkat nol dan menimpa file Anda tanpa apa-apa.

Bruno Pereira
sumber
katanya Izin ditolak, telah menggunakan chmod 755 nama file tetapi izin masih ditolak
sosytee
Bisakah Anda membaca izin file dengan pengguna normal Anda?
Bruno Pereira
ya saya bisa membaca isinya sebagai pengguna biasa
sosytee