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
ls
baskılar göreli yollar kullanmakxargs printf
klasör yolunu başa ekleyerek şeyi ve mutlak bir yol yapmak;Onları
sudo rm -rf
kullanarak 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 -rf
inanı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: sudo
Klasö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. ls
Ayrıca, sıralama düzeni için yerel ayarı da kullanır, bu yüzden head
son 2'yi kaldırmanın amacının ne olduğunu görmüyorum (kurtulmaya çalışmadığınız .
ve ..
iirc'in rm
zaten argüman olarak izin verilmediği sürece find /path/to/folder -type f delete
. hayır sudo
cron koşmak - cron zaten kök düzeyinde
printf -- '%s\0' /path/to/some/folder/* | head -zn -2 | xargs -0 rm
?