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
ls
mencetak path relatif, gunakanxargs printf
hal itu untuk menambahkan path folder dan menjadikannya path absolut;Kirim mereka untuk
sudo rm -rf
menggunakanxargs
.
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 -rf
sangat 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 sudo
karena 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
ls
output, ini sudah merupakan perintah yang ditulis dengan buruk, bahkan dengan mengutip. ls
juga menggunakan lokal untuk menyortir pesanan, saya pikir, jadi saya tidak melihat apa tujuan head
menghapus 2 terakhir (kecuali Anda mencoba untuk menyingkirkan .
dan ..
yang iirc tidak diizinkan sebagai argumen untuk rm
tetap. Cukup gunakan find /path/to/folder -type f delete
. Dan tidak sudo
jika Anda lari dari cron - cron sudah di level root
printf -- '%s\0' /path/to/some/folder/* | head -zn -2 | xargs -0 rm
?