Saya menulis sebuah skrip yang menghapus semua kecuali dua file terakhir dalam folder:
#!/bin/bash
ls -1 --quoting-style=shell-always /path/to/some/folder \
| head -n -2 \
| xargs printf -- "'/path/to/some/folder/%s'\n" \
| xargs sudo rm -rf
Script ini akan dieksekusi sebagai tugas cron setiap hari.
Alasannya adalah sebagai berikut:
Dapatkan daftar semua file menggunakan
ls -1(sehingga saya mendapatkan satu file per baris);Hapus dua yang terakhir dari daftar menggunakan
head -n -2;Karena
lsmencetak path relatif, gunakanxargs printfhal itu untuk menambahkan path folder dan menjadikannya path absolut;Kirim mereka untuk
sudo rm -rfmenggunakanxargs.
Setiap orang memiliki akses ke folder ini, jadi siapa pun dapat membuat dan menghapus file apa pun di folder ini.
Masalahnya adalah: sudo rm -rf menakutkan. xargs sudo rm -rfsangat menakutkan.
Saya ingin memastikan bahwa tidak ada yang dapat merusak folder / sistem lain dengan membuat file pintar untuk dihapus (baik secara tidak sengaja atau sengaja). Saya tidak tahu, sesuatu yang pintar seperti:
file with / spaces.txt
yang bisa menghasilkan super menakutkan sudo rm -rf /.
EDIT: Kesalahan saya, nama file tidak bisa mengandung /, jadi masalah khusus ini tidak akan terjadi, tetapi pertanyaan tentang apakah masih ada risiko lain.
Inilah sebabnya saya menggunakan --quoting-style=shell-always, ini harus mencegah trik dengan file dengan spasi. Tapi sekarang saya bertanya-tanya apakah seseorang bisa lebih pintar dengan spasi dan kutipan dalam nama file, mungkin.
Apakah skrip saya aman?
Catatan: Saya perlu sudokarena saya mengakses folder dari jarak jauh (dari drive jaringan yang dipetakan menggunakan mount), dan saya tidak bisa membuatnya bekerja tanpa sudo.
/dalam nama dibuat Saya mencoba untuk mencapai ini kembali di sini
lsoutput, ini sudah merupakan perintah yang ditulis dengan buruk, bahkan dengan mengutip. lsjuga menggunakan lokal untuk menyortir pesanan, saya pikir, jadi saya tidak melihat apa tujuan headmenghapus 2 terakhir (kecuali Anda mencoba untuk menyingkirkan .dan ..yang iirc tidak diizinkan sebagai argumen untuk rmtetap. Cukup gunakan find /path/to/folder -type f delete. Dan tidak sudojika Anda lari dari cron - cron sudah di level root
printf -- '%s\0' /path/to/some/folder/* | head -zn -2 | xargs -0 rm?