ฉันเขียนสคริปต์ที่ลบทั้งหมดยกเว้นไฟล์สองไฟล์สุดท้ายในโฟลเดอร์:
#!/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
สคริปต์นี้จะถูกเรียกใช้เป็นงาน cron ทุกวัน
เหตุผลมีดังนี้:
รับรายการไฟล์ทั้งหมดโดยใช้
ls -1
(เพื่อให้ได้หนึ่งไฟล์ต่อบรรทัด);นำสองคนสุดท้ายจากรายการใช้
head -n -2
;ตั้งแต่
ls
พิมพ์พา ธ ที่สัมพันธ์กันให้ใช้xargs printf
สิ่งต่าง ๆ เพื่อผนวกเส้นทางโฟลเดอร์และทำให้เป็นพา ธ สัมบูรณ์ส่งพวกเขาไปใช้
sudo rm -rf
xargs
ทุกคนสามารถเข้าถึงโฟลเดอร์นี้เพื่อให้ทุกคนสามารถสร้างและลบไฟล์ใด ๆ ในโฟลเดอร์นี้
ปัญหาคือ: sudo rm -rf
น่ากลัว xargs sudo rm -rf
น่ากลัวอย่างไม่น่าเชื่อ
ฉันต้องการให้แน่ใจว่าไม่มีใครสามารถสร้างความเสียหายให้กับโฟลเดอร์ / ระบบอื่น ๆ โดยการสร้างไฟล์ที่ฉลาดที่จะลบ (ไม่ว่าจะโดยบังเอิญหรือโดยเจตนา) ฉันไม่รู้สิ่งที่ฉลาดชอบ:
file with / spaces.txt
ซึ่งอาจส่งผลให้น่ากลัวสุดsudo rm -rf /
ๆ
แก้ไข:ความผิดพลาดของฉันชื่อไฟล์ไม่สามารถมีได้/
ดังนั้นปัญหาเฉพาะนี้จะไม่เกิดขึ้น แต่คำถามเกี่ยวกับความเสี่ยงอื่น ๆ ที่ยังคงมีอยู่หรือไม่
นี่คือเหตุผลที่ฉันกำลังใช้--quoting-style=shell-always
งานสิ่งนี้ควรป้องกันไม่ให้เล่ห์เหลี่ยมกับไฟล์ที่มีช่องว่าง แต่ตอนนี้ฉันสงสัยว่าบางคนอาจฉลาดกว่าเดิมด้วยช่องว่างและเครื่องหมายคำพูดในชื่อไฟล์บางที
สคริปต์ของฉันปลอดภัยหรือไม่?
หมายเหตุ: ฉันต้องการsudo
เพราะฉัน acessing โฟลเดอร์จากระยะไกล (จากไดรฟ์เครือข่ายที่แมปใช้mount
) และฉันไม่สามารถใช้งานได้หากไม่มี sudo
/
ในชื่อฉันพยายามที่จะทำให้มันกลับมาที่นี่อีกครั้งหรือไม่
ls
ผลลัพธ์นี่เป็นคำสั่งที่เขียนไม่ดีแม้ว่าจะมีการอ้างอิง ls
ฉันใช้สถานที่สำหรับการเรียงลำดับฉันคิดว่าฉันไม่เห็นว่าจุดประสงค์head
ในการลบ 2 รายการสุดท้าย (เว้นแต่คุณกำลังพยายามกำจัด.
และ..
ไม่อนุญาตให้ใช้ iirc ใดเป็นอาร์กิวเมนต์ในการrm
ต่อไปใช้เพียงfind /path/to/folder -type f delete
และ ไม่sudo
ถ้าคุณเรียกใช้จาก cron - cron อยู่ในระดับรากแล้ว
printf -- '%s\0' /path/to/some/folder/* | head -zn -2 | xargs -0 rm
?