ฉันมีไดเรกทอรีหลายชื่อ "ทดสอบ" และฉันต้องการลบออก
ฉันรู้วิธีค้นหาและพิมพ์โดยใช้:
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
+ในการค้นหา ฉันไม่รู้เลยว่าฉันอยากรู้มานานแล้ว