ฉันมีไดเรกทอรีหลายชื่อ "ทดสอบ" และฉันต้องการลบออก
ฉันรู้วิธีค้นหาและพิมพ์โดยใช้:
find . -name test -print
ตอนนี้ฉันจะลบไดเรกทอรีได้อย่างไร
โปรดทราบว่าฉันมีไฟล์ในไดเรกทอรีเช่นกันและจะต้องถูกลบเช่นกัน
ฉันมีไดเรกทอรีหลายชื่อ "ทดสอบ" และฉันต้องการลบออก
ฉันรู้วิธีค้นหาและพิมพ์โดยใช้:
find . -name test -print
ตอนนี้ฉันจะลบไดเรกทอรีได้อย่างไร
โปรดทราบว่าฉันมีไฟล์ในไดเรกทอรีเช่นกันและจะต้องถูกลบเช่นกัน
คำตอบ:
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
แก้ปัญหา)
xargs
คำสั่งการทำงานได้ดี
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ระบุไว้ในความคิดเห็น:
คุณสามารถใช้+
แทนที่จะ\;
ส่งมากกว่าหนึ่งไดเรกทอรีในเวลาเดียวกัน
+
แทนที่จะ\;
ส่งมากกว่าหนึ่งไดเรกทอรีในเวลาเดียวกัน
อีกวิธีหนึ่งในการทำเช่นนี้คือ
find . -name test -exec rm -R "{}" \;
ลิงค์ที่เป็นประโยชน์ในการค้นหา: http://www.softpanorama.info/Tools/Find/using_exec_option_and_xargs_in_find.shtml
คุณยังสามารถใช้ตัวเลือก -exec
find . -name test -exec rm {} \;
สมมติว่าทุบตี 4+
shopt -s globstar
rm -r ./**/test/
เครื่องหมายทับต่อท้ายหมายความว่ามันจะจับคู่ไดเรกทอรีเท่านั้น ทดสอบล่วงหน้าด้วย:
printf '%s\n' ./**/test/
ในขณะที่คำตอบอื่นชี้ให้เห็นคุณสามารถลองค้นหาไดเรกทอรีทั้งหมดที่มีชื่อtest
และลบออก
find -name "test" -type d -delete
ฉันพบปัญหาบางอย่างกับความเข้ากันได้ข้ามบน Mac ดังนั้นฉันจึงใช้คำสั่งนี้:
find -path "*/test" -type d -delete
อย่างไรก็ตามในกรณีใด ๆ หากไดเรกทอรีใด ๆ ที่ระบุว่า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
+
ในการค้นหา ฉันไม่รู้เลยว่าฉันอยากรู้มานานแล้ว