ค้นหาและลบไดเรกทอรีทั้งหมดที่ชื่อว่า "test" ใน linux


35

ฉันมีไดเรกทอรีหลายชื่อ "ทดสอบ" และฉันต้องการลบออก

ฉันรู้วิธีค้นหาและพิมพ์โดยใช้:

find . -name test -print

ตอนนี้ฉันจะลบไดเรกทอรีได้อย่างไร


โปรดทราบว่าฉันมีไฟล์ในไดเรกทอรีเช่นกันและจะต้องถูกลบเช่นกัน

คำตอบ:


70

xargs ไม่เวทมนตร์ทั้งหมด:

find . -name test -type d -print0|xargs -0 rm -r --

xargs เรียกใช้งานคำสั่งที่ส่งเป็นพารามิเตอร์โดยมีอาร์กิวเมนต์ส่งผ่านไปยัง stdin

สิ่งนี้ใช้rm -rเพื่อลบไดเรกทอรีและรายการย่อยทั้งหมด

--หมายถึงการสิ้นสุดของการขัดแย้งเพื่อหลีกเลี่ยงเส้นทางที่เริ่มต้นด้วย-จากการรับการรักษาเป็นอาร์กิวเมนต์

-print0บอกfindให้พิมพ์\0ตัวอักษรแทนการขึ้นบรรทัดใหม่; และ-0บอกxargsให้ถือว่า\0เป็นตัวคั่นอาร์กิวเมนต์เท่านั้น

นี่คือการเรียกrmใช้หลายไดเรกทอรีพร้อมกันหลีกเลี่ยงค่าใช้จ่ายในการโทรrmแยกต่างหากสำหรับแต่ละไดเรกทอรี


เป็นทางเลือกfindนอกจากนี้ยังสามารถเรียกใช้คำสั่งสำหรับแต่ละไฟล์ที่เลือก :

find . -name test -type d -exec rm -r {} \;

และอันนี้มีประสิทธิภาพที่ดีกว่าเนื่องจากมันจะเรียกrmใช้หลายไดเร็กทอรีพร้อมกัน:

find . -name test -type d -exec rm -r {} +

(สังเกต+ที่ท้าย; อันนี้เทียบเท่ากับการxargsแก้ปัญหา)


1
คำตอบที่ยอดเยี่ยมโดยเฉพาะอย่างยิ่ง+ในการค้นหา ฉันไม่รู้เลยว่าฉันอยากรู้มานานแล้ว
สกอตต์

ระวังคำสั่งสุดท้ายอย่างใดมันก็ลบบางไฟล์ xargsคำสั่งการทำงานได้ดี
Henrique de Sousa

23
find /path/to/dir -name "test" -type d -delete
  • -name:ค้นหาชื่อที่ส่งผ่าน คุณสามารถใช้-regexสำหรับการให้ชื่อตามนิพจน์ทั่วไป

  • -type:ค้นหาประเภทไฟล์ dค้นหาเฉพาะไดเรกทอรี

  • -delete:การกระทำที่ลบรายการที่พบ

อีกวิธีหนึ่งคือ:

find /path/to/dir -name "test" -type d -exec rm -rf {} \;

ดังที่JF Sebastianระบุไว้ในความคิดเห็น:

คุณสามารถใช้+แทนที่จะ\;ส่งมากกว่าหนึ่งไดเรกทอรีในเวลาเดียวกัน


1
ขออภัยฉันลืมพูดถึงว่าไดเรกทอรีเหล่านี้อาจมีไฟล์ ฉันไม่สามารถลบบางส่วนได้เนื่องจากข้อผิดพลาด "ค้นหา: ไม่สามารถลบ` ./start ': ไดเรกทอรีไม่ว่างเปล่า "
การรวบรวมขยะ

@garbagecollection ฉันเพิ่มการอัปเดต
jaypal singh

3
คุณสามารถใช้+แทนที่จะ\;ส่งมากกว่าหนึ่งไดเรกทอรีในเวลาเดียวกัน
jfs

ขอบคุณ @JFSebastian จุดดี ฉันจะเพิ่มลงในคำตอบ
jaypal singh



3

สมมติว่าทุบตี 4+

shopt -s globstar
rm -r ./**/test/

เครื่องหมายทับต่อท้ายหมายความว่ามันจะจับคู่ไดเรกทอรีเท่านั้น ทดสอบล่วงหน้าด้วย:

printf '%s\n' ./**/test/


2

ในขณะที่คำตอบอื่นชี้ให้เห็นคุณสามารถลองค้นหาไดเรกทอรีทั้งหมดที่มีชื่อtestและลบออก

find -name "test" -type d -delete

ฉันพบปัญหาบางอย่างกับความเข้ากันได้ข้ามบน Mac ดังนั้นฉันจึงใช้คำสั่งนี้:

find -path "*/test" -type d -delete
  • -path : ค้นหารูปแบบในชื่อไฟล์ที่ผ่านการรับรองโดยสมบูรณ์

อย่างไรก็ตามในกรณีใด ๆ หากไดเรกทอรีใด ๆ ที่ระบุว่าtestมีไฟล์อยู่ในนั้นfindจะบ่นว่าDirectory is not emptyและจะไม่สามารถลบไดเรกทอรีได้

หากคุณตั้งใจจะลบไฟล์ทั้งหมดรวมถึงtestไดเรกทอรีเราสามารถใช้เคล็ดลับเดียวกันเพื่อลบไฟล์ทั้งหมดภายในไดเรกทอรีที่มีชื่อtestก่อน

find -path "*/test/*" -delete

รูปแบบ: "*/test/*"จะทำให้แน่ใจว่าเราจะลบไฟล์ภายในไดเรกทอรีที่มีชื่อ/test/เท่านั้น เมื่อไดเรกทอรีว่างเปล่าเราสามารถไปข้างหน้าและลบไดเรกทอรีโดยใช้คำสั่งแรก:

find -path "*/test" -type d -delete

ตัวอย่าง:

$ tree
.
├── mytest
│   └── test
│       └── blah.txt
├── test
│   ├── bar.jpg
│   └── dir
│       └── bar.bak
└── testdir
    └── baz.c

5 directories, 4 files

$ find -path "*/test" -type d -delete
$ tree
.
├── mytest
│   └── test
├── test
└── testdir
    └── baz.c

4 directories, 1 file

$ find -name "test" -type d -delete
$ tree
.
├── mytest
└── testdir
    └── baz.c

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