วิธีลบโฟลเดอร์ที่มีชื่อเฉพาะ


146

ใน Linux ฉันจะลบโฟลเดอร์ที่มีชื่อเฉพาะซึ่งซ้อนอยู่ลึก ๆ ในลำดับชั้นของโฟลเดอร์ได้อย่างไร

aเส้นทางต่อไปนี้อยู่ภายใต้โฟลเดอร์และผมอยากจะลบโฟลเดอร์ทั้งหมดชื่อ

1/2/3/a
1/2/3/b
10/20/30/a
10/20/30/b
100/200/300/a
100/200/300/b

ฉันควรใช้คำสั่ง Linux อะไรจากโฟลเดอร์หลัก


บางทีอาจพลาดประเด็นไป แต่อาจช่วยใครบางคนได้: ฉันมี 410 โฟลเดอร์ในโฟลเดอร์หลัก - 410 โฟลเดอร์แต่ละโฟลเดอร์มีโฟลเดอร์ย่อยสองโฟลเดอร์ โฟลเดอร์ย่อยแรกทั้งหมดมีชื่อว่า 'สุดท้าย' และมีไฟล์ PDF ที่แก้ไขและรายการเนื้อหาของ Word โฟลเดอร์ย่อยที่สองทั้งหมดที่ชื่อ tif_pdf_various_names ประกอบด้วยไฟล์ tiff ที่บันทึกไว้เดิมที่สแกนแล้ว (บางส่วนมากถึง 200 หน้า) ไฟล์ PDF ที่ยังไม่ได้แก้ไขและรายการเนื้อหา. docx แบบร่างซึ่งเป็นคอลเล็กชันโฮมเวิร์ค ฉันต้องการสร้างคอลเลกชันของโฟลเดอร์ 410 โฟลเดอร์ที่มีเพียงวัสดุที่แก้ไขในที่สุด - โดยมี tiff ใกล้เคียงกับ 4TB พบวิธีที่ง่ายที่สุดคือใช้ (ใน Micr
Jurie

คำตอบ:


164

หากไดเร็กทอรีเป้าหมายว่างเปล่าให้ใช้ find กรองด้วยไดเร็กทอรีเท่านั้นกรองตามชื่อรัน rmdir:

find . -type d -name a -exec rmdir {} \;

หากคุณต้องการที่จะซ้ำลบเนื้อหาที่ได้เปลี่ยน-exec rmdir {} \;ด้วยหรือ-delete -prune -exec rm -rf {} \;คำตอบอื่น ๆ รวมถึงรายละเอียดเกี่ยวกับเวอร์ชันเหล่านี้ให้เครดิตด้วย


9
คุณช่วยอธิบายได้{} \;ไหมว่าอะไร?
winklerrr

7
{}สามารถอ่านได้ว่า "สำหรับแต่ละไฟล์ / โฟลเดอร์ที่ตรงกัน" นั่นคือใช้แทนไฟล์ / โฟลเดอร์ "ที่พบ" แต่ละไฟล์ \;เป็นตัวยุติสำหรับ-execประโยค
wmorrison365

2
สิ่งนี้ทำให้ฉันมีข้อผิดพลาด "ไม่สามารถลบ" เมื่อไดเรกทอรีไม่ว่างเปล่า
ตาบอด

1
พิจารณาเพิ่ม-pruneค่าสถานะให้กับคำตอบตามคำแนะนำของ @David Grayson หากไม่มีสิ่งนี้findจะยังคงพยายามเยี่ยมชมโฟลเดอร์ที่หายไปในขณะนี้และในที่สุดก็จะออกด้วยรหัสข้อผิดพลาดซึ่งอาจเช่นการสร้าง Docker ล้มเหลว
Czyzby

165

ใช้ find สำหรับชื่อ "a" และดำเนินการ rm เพื่อลบผู้ที่ตั้งชื่อตามความต้องการของคุณดังนี้:

find . -name a -exec rm -rf {} \;

ทดสอบครั้งแรกโดยใช้ ls to list:

find . -name a -exec ls {} \;

เพื่อให้แน่ใจว่าสิ่งนี้จะลบเฉพาะไดเร็กทอรีและไม่ใช่ไฟล์ธรรมดาให้ใช้ "-type d" arg (ตามที่แนะนำในความคิดเห็น):

find . -name a -type d -exec rm -rf {} \;

"{}" คือการแทนที่สำหรับแต่ละไฟล์ "a" ที่พบ - คำสั่ง exec จะดำเนินการกับแต่ละไฟล์โดยการแทนที่


4
คุณอาจต้องการเพิ่ม "-type d" ในนั้นในกรณีที่ไฟล์ตรงกับชื่อเดียวกัน
Mark Loeser

3
โปรดทราบว่าสิ่งนี้จะจับสิ่งที่ชอบ1/2/a/3/4ซึ่งอาจไม่ได้ตั้งใจดังนั้น +1 สำหรับคำแนะนำเพื่อทดสอบก่อน ...
twalberg

9
Reco echo {}ในการทดสอบครั้งแรกแทนls {}
Charney เคย์

2
node_modules/นี่ฉันไป
saruftw

8
ฉันใช้find . -name a -type d -exec rm -rf {} \;และมันใช้งานได้แม้ว่าจะพิมพ์ออกมาfind: ‘./subdir/subdir/a’: No such file or directoryสำหรับแต่ละไดเรกทอรีที่ถูกลบ
pacoverflow

63

วิธีนี้ใช้งานได้เช่นกัน - จะลบโฟลเดอร์ทั้งหมดที่เรียกว่า "a" และเนื้อหา:

rm -rf `find -type d -name a`

@ ควายมาได้ไง defo นี้ใช้ได้ผล แต่คนอื่น ๆ ก็เช่นกัน จะประหลาดใจที่จะหา env ที่ทำงานนี้ แต่คนอื่น ๆ find/rmไม่ได้รับทุกคำตอบจะเป็นหลัก
wmorrison365

5
@ wmorrison365 เพราะถ้าคุณทำfind . -name a -exec rm -rf {} \;ค้นหาจะผิดพลาดเมื่อพยายามที่จะเข้าสู่ไดเรกทอรีที่จะมองหารายการอื่น ๆ find: '1/2/3/a': No such file or directoryอีกมากมายให้คุณมีข้อผิดพลาดเหมือน
Alex Grönholm

@Alex Grönholmแน่นอน แต่โฟลเดอร์ทั้งหมดที่ชื่อ 'a' จะถูกลบไปด้วย ตามที่คุณระบุการค้นหาไม่สามารถมองเข้าไปในโฟลเดอร์ 'a' ที่ถูกลบได้ในภายหลัง แต่นั่นไม่สำคัญ การต้องการเก็บเนื้อหาของ 'a' ไว้สำหรับการประมวลผลในภายหลังก่อนที่จะลบเป็นกรณีการใช้งานที่แตกต่างจากสิ่งที่ OP ถาม
wmorrison365

7
@ wmorrison365 ใช่ไดเร็กทอรีถูกลบไปแล้ว แต่ฉันคิดว่าไม่ดีที่จะแนะนำวิธีแก้ปัญหาที่คำสั่งล้มเหลว (ส่งคืนรหัสออกที่ไม่ใช่ศูนย์)
Alex Grönholm

2
illegal option --tนี้ได้ให้ฉันข้อผิดพลาด ฉันได้ไปยังผ่านไดเรกทอรีค้นหาใน ( stackoverflow.com/questions/25840713/...rm -rf `find . -type d -name a` ):
Steve Harrison

27

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

find -type d -name foo -a -prune -exec rm -rf {} \;

คำตอบอื่น ๆ ไม่มีสิ่งสำคัญ: -pruneตัวเลือก หากไม่มี-pruneGNU find จะลบไดเร็กทอรีที่มีชื่อที่ตรงกันจากนั้นพยายามเรียกคืนเพื่อค้นหาไดเร็กทอรีเพิ่มเติมที่ตรงกัน -pruneตัวเลือกที่จะบอกว่ามันไม่ recurse ในไดเรกทอรีที่ตรงกับเงื่อนไขที่


24

ฉันสิ้นสุดขึ้นที่นี่มองของฉันจะลบโฟลเดอร์ก่อนที่จะทำสำรองข้อมูลการทำงานของผมในความคืบหน้าการใช้node_modules rsyncข้อกำหนดสำคัญคือnode_modulesโฟลเดอร์สามารถซ้อนกันได้ดังนั้นคุณต้องมี-pruneตัวเลือก

ก่อนอื่นฉันรันสิ่งนี้เพื่อตรวจสอบโฟลเดอร์ที่จะลบด้วยสายตา:

find -type d -name node_modules -prune

จากนั้นฉันเรียกใช้สิ่งนี้เพื่อลบทั้งหมด:

find -type d -name node_modules -prune -exec rm -rf {} \;

ขอบคุณ pistache


อ่าทำงานได้ดีเพื่อให้เป็นสิ่งที่คุณสามารถใช้ได้อย่างง่ายดายคุณสามารถบันทึกสิ่งนี้ไว้เป็นคำศัพท์เล็ก ๆ น้อย ๆ ได้: sh #!/bin/bash echo "Found node_modules: "; find -type d -name node_modules -prune; read -r -p "Do you really want to delete all directories? [yes/no] " input; if [ ! $input != "yes" ]; then find -type d -name node_modules -prune -exec rm -rf {} \;; fi
Feirell

ใน Macbook Pro ของฉันเมื่อฉันรันคำสั่งของคุณฉันได้รับ "ตัวเลือกที่ผิดกฎหมาย - t" ผมจึงเพิ่มจุด คำสั่งของฉัน:find . -type d -name node_modules -prune -exec rm -rf {} \;
Christiaan Westerbeek

11
find ./ -name "FOLDERNAME" | xargs rm -Rf

ควรทำเคล็ดลับ คำเตือนหากคุณเผลอปั๊ม.หรือ/เข้าไปในxargs rm -Rfคอมพิวเตอร์ทั้งหมดของคุณโดยไม่ได้ตั้งใจจะถูกลบโดยไม่มีตัวเลือกในการกู้คืนทำให้ต้องติดตั้งระบบปฏิบัติการใหม่


2
โอ้ความเสี่ยงเล็ก ๆ น้อย ๆ นั่นหมดแล้วหรือ? ฮ่า ๆ . ขอบคุณมากสำหรับคำเตือน ฉันคงจะพิมพ์ผิดแน่ ๆ
TinkerTenorSoftwareGuy

9

ฉันมีไฟล์มากกว่า 100 ไฟล์เช่น

log-12
log-123
log-34
....

คำตอบข้างต้นไม่ได้ผลสำหรับฉัน

แต่คำสั่งต่อไปนี้ช่วยฉันได้

find . -name "log-*" -exec rm  -rf {} \;

ฉันให้-typeเป็น.เพื่อจะลบทั้งไฟล์และโฟลเดอร์ซึ่งเริ่มต้นด้วยlog-

และrm -rfลบโฟลเดอร์ซ้ำ ๆ แม้ว่าจะมีไฟล์อยู่ก็ตาม

หากคุณต้องการโฟลเดอร์เพียงอย่างเดียว

find -type d -name "log-*" -exec rm  -rf {} \;

ไฟล์เพียงอย่างเดียว

find -type f -name "log-*" -exec rm  -rf {} \;

9

คำสั่งนี้ใช้ได้กับฉัน มันทำงานซ้ำ ๆ

find . -name "node_modules" -type d -prune -exec rm -rf '{}' +

. - โฟลเดอร์ปัจจุบัน

"node_modules" - ชื่อโฟลเดอร์


8

เมื่อรวมคำตอบหลายคำเข้าด้วยกันนี่คือคำสั่งที่ใช้ได้ทั้งบน Linux และ MacOS

rm -rf $(find . -type d -name __pycache__)

มีเพียงคนเดียวที่ได้ผลสำหรับฉันที่ไม่ได้ส่งข้อผิดพลาด
Kloar

7

อีกอันหนึ่ง:

"-exec rm -rf {} \;" can be replaced by "-delete"

find -type d -name __pycache__ -delete      # GNU find
find . -type d -name __pycache__ -delete    # POSIX find (e.g. Mac OS X)

3
คำตอบนี้ใช้ได้กับโฟลเดอร์เปล่าเท่านั้น -deleteไม่ลบโฟลเดอร์ที่ไม่ว่างเปล่า
maninak

ขอขอบคุณที่เพิ่มเวอร์ชัน OSX
schu34

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