-deleteบอกเป็นนัย ๆ-depthว่าใช้ไม่ได้กับ-prune( -depthเริ่มต้นด้วยใบไม้) มีคำเตือนเกี่ยวกับสิ่งนั้นในคู่มือของ GNU เวอร์ชัน ( -deleteเป็นส่วนขยาย FreeBSD ตอนนี้ยังรองรับโดย GNU findและการใช้งานอื่น ๆ สองสาม)
info find --index-search=-delete
การใช้การกระทำ '-delete' บนบรรทัดคำสั่งจะเปิดตัวเลือก '-depth' โดยอัตโนมัติ (* note find Expressions: :) สิ่งนี้อาจน่าประหลาดใจหากก่อนหน้านี้คุณเพิ่งทดสอบด้วย '-print' ดังนั้นจึงควรจำไว้ว่าให้ใช้ '-depth' อย่างชัดเจน
info find --index-search=-prune
เนื่องจาก '-delete' หมายถึง '-depth' การใช้ '-prune' ร่วมกับ '-delete' อาจส่งผลให้มีการลบไฟล์มากกว่าที่คุณตั้งใจ
ที่นี่คุณมีตัวเลือกในการใช้งานrmแทน:
find . -name save -prune -o -type f -exec rm -f {} +
(อาจไม่ปลอดภัยหากมีไดเรกทอรีที่ผู้อื่นสามารถเขียนได้เพราะอาจทำให้คุณลบไฟล์ที่อยู่นอกแผนผังไดเรกทอรีปัจจุบันโดยแทนที่ไดเรกทอรีด้วย symlinks ขณะที่คุณเรียกใช้คำสั่งนั้น)
ทางเลือกที่ปลอดภัยกว่า:
find . -name save -prune -o -type f -execdir rm -f -- {} \;
ไม่ได้มีปัญหาดังกล่าวข้างต้น แต่หมายถึงการทำงานอย่างใดอย่างหนึ่งrmต่อไฟล์ --เป็นสิ่งที่จำเป็นสำหรับการดำเนินงาน FreeBSD ไม่ GNU ./หนึ่งที่นำหน้าชื่อไฟล์ที่มี
อีกทางหนึ่งตามที่ Costas แนะนำ:
LC_ALL=C find . ! -name save ! -path '*/save/*' -type f -delete
(แต่ยังไม่จำเป็นต้องสืบทอดลงในsaveไดเรกทอรี)
LC_ALL=Cมีเพื่อให้*ตรงกับลำดับใด ๆ ของไบต์ (แม้กระทั่งผู้ที่ไม่ได้แบบตัวอักษรที่ถูกต้องในสถานที่ปัจจุบัน) โปรดทราบว่าจะมีผลกับภาษาของข้อความแสดงข้อผิดพลาด (ภาษาอังกฤษแทนที่จะเป็นภาษาของผู้ใช้)
mv save/ ../some/safer/locationก่อนหน้าคำสั่งลบ "ทั่วไป" (... แต่แน่นอนก่อนที่จะโพสต์ของคุณฉันได้ทำการตรวจสอบแบบเดียวกันและพบปัญหาเดียวกัน!) ตอนนี้ไปหา "ยกเลิกการลบ" ที่ดีสำหรับระบบไฟล์ที่ไฟล์อยู่ ^^