-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
ก่อนหน้าคำสั่งลบ "ทั่วไป" (... แต่แน่นอนก่อนที่จะโพสต์ของคุณฉันได้ทำการตรวจสอบแบบเดียวกันและพบปัญหาเดียวกัน!) ตอนนี้ไปหา "ยกเลิกการลบ" ที่ดีสำหรับระบบไฟล์ที่ไฟล์อยู่ ^^