Bir klasördeki son iki dosya hariç tüm dosyaları silen bir komut dosyası yazdım:
#!/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
Bu script her gün bir cron işi olarak yürütülecek.
Akıl yürütme aşağıdaki gibidir:
Kullanarak tüm dosyaların bir listesini elde
ls -1(böylece satır başına bir dosya almak);Kullanarak son iki listeden çıkarın
head -n -2;Yana
lsbaskılar göreli yollar kullanmakxargs printfklasör yolunu başa ekleyerek şeyi ve mutlak bir yol yapmak;Onları
sudo rm -rfkullanarak gönderinxargs.
Herkesin bu klasöre erişimi vardır, böylece herkes bu klasördeki dosyaları oluşturabilir ve silebilir.
Sorun şudur: sudo rm -rf korkutucu. xargs sudo rm -rfinanılmaz derecede korkutucu.
Silinecek akıllı dosyalar (yanlışlıkla veya bilerek) oluşturarak kimsenin diğer klasörlere / sistemlere zarar veremeyeceğinden emin olmak istiyorum. Bilmiyorum, zekice bir şey:
file with / spaces.txt
bu da çok korkutucu olabilir sudo rm -rf /.
EDIT: Benim hatam, dosya adları içeremez /, bu nedenle bu özel sorun olmaz, ancak başka riskler olup olmadığı sorusu hala duruyor.
Bu yüzden kullanıyorum --quoting-style=shell-always, bu boşluklu dosyaları olan hileleri önlemelidir. Ama şimdi birisinin dosya adındaki boşluklarla ve alıntılarla ekstra zeki olup olmadığını merak ediyorum .
Senaryom güvenli mi?
Not: sudoKlasöre uzaktan eriştiğim için kullanıyorum (kullanarak bir eşlenen ağ sürücüsünden mount) ve sudo olmadan çalışamadım.
/
lsÇıktıyı ayrıştırdığınız için bu, alıntıda bile zaten kötü yazılmış bir komuttur. lsAyrıca, sıralama düzeni için yerel ayarı da kullanır, bu yüzden headson 2'yi kaldırmanın amacının ne olduğunu görmüyorum (kurtulmaya çalışmadığınız .ve ..iirc'in rmzaten argüman olarak izin verilmediği sürece find /path/to/folder -type f delete. hayır sudocron koşmak - cron zaten kök düzeyinde
printf -- '%s\0' /path/to/some/folder/* | head -zn -2 | xargs -0 rm?