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.
command-line
sosytee
sumber
sumber
tail -n +1000 file.txt > file.txt
harus menghapus 1000 baris dan menyimpan baris terbaru dalam file (Anda tidak pernah tahu kapan Anda mungkin memerlukan beberapa catatan terbaru untuk melacak sesuatu).Jawaban:
Cara paling sederhana:
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:ketika Anda tidak memiliki izin pada file itu. Tapi Anda bisa menggunakan:
sumber
sudo crontab -e
untuk 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_Permissionstruncate filename
sedikit lebih bersih dan lebih sederhana daripada mengarahkan kembali output kosong ke file dan tidak mengalami masalah dengansudo
.truncate -s 0 filename
memang bisa membuat trik. Anda dapat menambahkannya sebagai jawaban.Ada alat yang dibuat untuk tujuan itu:
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:
Ini juga menyimpan inode yang sama.
Perhatikan bahwa keduanya
truncate
danecho -n
tidak didefinisikan oleh POSIX .Untuk penggunaan kepatuhan POSIX
cat /dev/null
:Namun cara lain, lebih tidak jelas dan mungkin tidak shell agnostik:
Jika file yang terpotong membutuhkan root untuk menulis maka baris berikut tidak akan berfungsi seperti yang diharapkan:
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:
Menggunakan
truncate
Anda tidak perlu solusi seperti itu karena akses tulis tidak dilakukan oleh shell tetapi olehtruncate
yang dijalankan oleh sudo menggunakan hak sudo.Untuk beberapa detail berdarah tentang program yang menahan file terbuka walaupun file telah dihapus, Anda dapat membaca yang berikut:
sumber
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
sumber
echo "" > foo_file
adalah 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.sumber