ฉันจะลบไดเรกทอรีซ้ำด้วยสัญลักษณ์แทนได้อย่างไร


51

ฉันทำงานผ่าน SSH ใน WD My Book World Edition โดยทั่วไปฉันต้องการเริ่มต้นที่ระดับไดเรกทอรีเฉพาะและลบไดเรกทอรีย่อยที่ตรงกัน.Apple*ทั้งหมดซ้ำ ๆ ฉันจะทำยังไง

ฉันเหนื่อย

rm -rf .Apple* และ rm -fR .Apple*

ไม่ลบไดเรกทอรีที่ตรงกับชื่อนั้นภายในไดเรกทอรีย่อย

คำตอบ:


73

find มีประโยชน์มากสำหรับการเลือกดำเนินการกับต้นไม้ทั้งหมด

find . -type f -name ".Apple*" -delete

ที่นี่-type fทำให้แน่ใจว่าเป็นไฟล์ไม่ใช่ไดเรกทอรีและอาจไม่ตรงตามที่คุณต้องการเพราะมันจะข้าม symlinks ซ็อกเก็ตและสิ่งอื่น ๆ คุณสามารถใช้! -type dซึ่งหมายถึงแท้จริงไม่ใช่ไดเรกทอรี แต่จากนั้นคุณอาจลบอักขระและอุปกรณ์บล็อก ผมขอแนะนำให้ดูที่คำกริยาในหน้าคนสำหรับ-typefind

ในการที่จะใช้ wildcard อย่างเคร่งครัดคุณต้องมีการรองรับเชลล์ขั้นสูง ทุบตี v4 มีglobstarตัวเลือก**ซึ่งช่วยให้คุณซ้ำตรงกับไดเรกทอรีย่อยใช้ zshและkshสนับสนุนรูปแบบนี้ rm -rf **/.Apple*การใช้ที่คุณสามารถทำได้ นี่ไม่ใช่มาตรฐาน POSIX และไม่พกพาได้ดังนั้นฉันจะหลีกเลี่ยงการใช้สคริปต์ แต่สำหรับการโต้ตอบเชลล์แบบโต้ตอบครั้งเดียวก็ใช้ได้


3
ฉันfind . -type d -name .Apple*ไปทำงานได้ - มันแสดงรายการโฟลเดอร์ทั้งหมด อย่างไรก็ตามมันล้มเหลวเมื่อฉันเพิ่ม-deleteในตอนท้าย มันเพิ่งกลับมาพร้อมกับสรุปการใช้งาน มันทำงานบน BusyBox v1.1.1 นั่นสร้างความแตกต่างหรือไม่?
codedog

1
-deleteไม่ใช่ POSIX เช่นกัน **เปิดตัวzshในช่วงต้นยุค 90 ตอนนี้ (ตามลำดับเวลาของการปรากฏตัว) ใน ksh93, ปลา, ทุบตีและ tcsh
Stéphane Chazelas

1
+1 สำหรับrm -rf **/.Apple*
Andriy Boyko

1
@codedog หาก-deleteใช้งานไม่ได้-exec rm -f {} +แทน
Wildcard

1
คุณจะได้รับfindverbose เมื่อมันถูกลบ? ฉันคิดว่าวิธี "globstar" จะทำได้โดยการเพิ่ม-vสวิตช์
Demis

16

ฉันวิ่งเข้าไปในปัญหาในการใช้findด้วย-deleteเนื่องจากพฤติกรรมของเจตนาfind(คือปฏิเสธที่จะลบถ้าเส้นทางเริ่มต้นด้วย ./ ซึ่งพวกเขาทำในกรณีของฉัน) ตามที่ระบุไว้ในหน้าคนที่:

 -delete

ลบไฟล์และ / หรือไดเรกทอรีที่พบ ผลตอบแทนที่แท้จริงเสมอ สิ่งนี้เรียกใช้จากไดเร็กทอรีการทำงานปัจจุบันเมื่อค้นหา recurses ลงต้นไม้ จะไม่พยายามลบชื่อไฟล์ที่มีอักขระ "/" ในชื่อพา ธ ที่สัมพันธ์กับ "." เพื่อเหตุผลด้านความปลอดภัย
การประมวลผลการสำรวจเส้นทางแรกลึกโดยนัยนี้ตัวเลือกนี้
symlink ต่อไปนี้เข้ากันไม่ได้กับตัวเลือกนี้

แต่ฉันสามารถทำได้

find . -type d -name 'received_*_output' -exec rm -r {} +

สำหรับกรณีของคุณดูเหมือนว่าการอ้างอิง glob (เครื่องหมายดอกจัน *) เป็นวิธีแก้ปัญหา แต่ฉันต้องการให้คำตอบในกรณีที่คนอื่นมีปัญหาคล้ายกัน

หมายเหตุ: ก่อนหน้านี้คำตอบของฉันคือทำดังต่อไปนี้ แต่ @Wildcard ชี้ให้เห็นข้อบกพร่องด้านความปลอดภัยในการทำเช่นนั้นในความคิดเห็น

find . -type d -name 'received_*_output' | xargs rm -r

1
ไม่มีเหตุผลที่ดีที่จะใช้xargsที่นี่ -exec rm -r {} \;หรือดีกว่า-exec rm -r {} +ก็ทำได้เช่นกันโดยไม่ล้มเหลวในชื่อไฟล์อักขระพิเศษ ดูเหตุใดจึงวนลูปมากกว่าการฝึกเอาท์พุทของ find find
Wildcard

เป็นเรื่องดีที่รู้ ไม่คุ้มค่ากับ downvote, IMO เนื่องจากคำสั่งยังคงทำงานให้เสร็จ แต่การเพิ่มประสิทธิภาพได้รับการชื่นชม
Pat

1
หากเป็นเพียงการเพิ่มประสิทธิภาพฉันจะเห็นด้วยกับคุณ แต่ไม่ใช่ มันเป็นช่องโหว่ คุณจัดการไฟล์ที่มีช่องว่างในชื่อไม่ถูกต้องและชื่อไฟล์ที่ออกแบบมาเพื่อประสงค์ร้ายจะทำให้ข้อมูลสูญหาย ดูที่นัยยะด้านความปลอดภัยของการลืมอ้างตัวแปรในเชลล์ bash / POSIX ; มีบางอย่างที่ใช้ได้และอย่างน้อยก็อาจทำให้คุณมีความคิดเกี่ยวกับประเภทของปัญหาที่ฉันกำลังพูดถึง
Wildcard

ลองmkdir -p $'blah\nDocuments\n/etc\n/home\n/received__output'ในไดเรกทอรีของคุณแล้วเรียกใช้คำสั่งเดียวกันอีกครั้งหากคุณไม่เชื่อว่าอาจมีข้อมูลสูญหาย หรือตั้งแต่คำถามที่เป็นเรื่องเกี่ยวกับระบบปฏิบัติการ Mac mkdir -p $'blah\nDocuments\n/Users\n/Applications\n/received__output'OS, ( คำเตือน:คุณจะลบไฟล์ทั้งหมดของคุณถ้าคุณทำเช่นนั้นนั่นเป็นประเด็นของฉัน)
Wildcard

0

สิ่งที่เป็นไปได้คือไม่มีอะไรผิดปกติกับคำสั่ง rm / find ของคุณ แต่ผู้ใช้ที่คุณเข้าสู่ระบบด้วยไม่มีสิทธิ์ในการลบ ใช้ls -lเพื่อแสดงรายการสิ่งต่าง ๆ ด้วยการอนุญาตของพวกเขาและคุณสามารถระบุได้ว่าคุณเป็นใครด้วยidและgroupsคำสั่ง (ควรมีอยู่) หากคุณเป็น "ผู้ใช้ที่ไม่ถูกต้อง" ในการทำเช่นนี้คุณจะต้องเปลี่ยนการอนุญาต / การเป็นเจ้าของไฟล์หรือเปลี่ยนไปใช้ผู้ใช้รายอื่น



-1

คำสั่งง่าย ๆ :

rm `find ./ -name '.Apple*'` -rf

โชคดี!


4
นี่เป็นข้อผิดพลาดที่ง่ายมากค้นหามีคีย์ -exec
Anton Barkovsky
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.