foo/ว่าฉันมีไดเรกทอรีชื่อ โฟลเดอร์นี้มีไดเรกทอรีย่อย ฉันจะลบไดเรกทอรีว่างทั้งหมดในคำสั่งเดียวได้อย่างไร
foo/ว่าฉันมีไดเรกทอรีชื่อ โฟลเดอร์นี้มีไดเรกทอรีย่อย ฉันจะลบไดเรกทอรีว่างทั้งหมดในคำสั่งเดียวได้อย่างไร
คำตอบ:
ลองคำสั่งนี้:
find . -empty -type d -delete
findคำสั่งที่ใช้ในการค้นหาไฟล์ / ไดเรกทอรีที่ตรงกับเกณฑ์การค้นหาโดยเฉพาะอย่างยิ่งจากเส้นทางที่ระบุในกรณีนี้ไดเรกทอรีปัจจุบัน (จึง.)
-emptyตัวเลือกถือเป็นจริงสำหรับไฟล์ใด ๆ และไดเรกทอรีที่ว่างเปล่า
-type dตัวเลือกถือเป็นจริงสำหรับไฟล์ชนิดที่ระบุ; ในกรณีนี้dหมายถึงประเภทของไฟล์ไดเรกทอรี
-deleteตัวเลือกคือการกระทำที่จะดำเนินการและถือเป็นจริงสำหรับไฟล์ทั้งหมดที่พบในการค้นหา
rm -rf <directory-name>วิธีที่คุณจะลบไดเรกทอรีโดยไม่คำนึงถึงหรือไม่ว่าพวกเขาจะมีที่ว่างเปล่าให้พิมพ์คำสั่งต่อไปนี้: นี่จะเป็นการลบไดเรกทอรีรวมถึงเนื้อหาทั้งหมดรวมถึงไฟล์และไดเรกทอรีย่อย -rตัวเลือกหมายความว่าลบซ้ำในขณะที่-fคำสั่งหมายถึงไม่ได้แจ้งให้ก่อนที่จะลบ หากคุณต้องการให้ระบบแจ้งเตือนก่อนที่จะลบไดเรกทอรี / ไฟล์ให้แทนที่-fตัวเลือกด้วย-iตัวเลือก
stdoutของคำสั่งหนึ่ง (เช่นfind) ลงในstdinส่วนของอื่น ๆ (เช่นrm) แต่ต้องระวังให้มากเพราะมันอาจจะเช็ดออกหรือลบไฟล์ / ไดเรกทอรีที่คุณไม่ต้องการที่จะ ลบ! สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการทำสิ่งนี้ให้ดูmanหน้าสำหรับแต่ละคำสั่งเหล่านี้ เพื่อความปลอดภัยให้ทดสอบสิ่งต่าง ๆ ดังกล่าวในไดเรกทอรีชั่วคราวก่อนลองใช้ของจริง
คุณสามารถใช้ประโยชน์จากการrmdirปฏิเสธคำสั่งเพื่อลบไดเรกทอรีที่ไม่ว่างเปล่าและfind -depthตัวเลือกในการสำรวจแผนผังไดเรกทอรีจากล่างขึ้นบน:
find . -depth -exec rmdir {} \;
(และละเว้นข้อผิดพลาด) หรือผนวก2>/dev/nullเพื่อละเว้นข้อผิดพลาดจริง ๆ
-depthตัวเลือกที่จะfindเริ่มต้นการค้นหาที่ด้านล่างของต้นไม้ไดเรกทอรี
rm -rfจะลบไฟล์ทั้งหมดในไดเรกทอรี (และไดเรกทอรีย่อยและ .... ) และไดเรกทอรีทั้งหมดและทุกอย่าง
rmdir *
จะลบไดเรกทอรีว่างทั้งหมด มันจะทำให้เกิดข้อผิดพลาดสำหรับไดเรกทอรีและไฟล์ที่ไม่ว่างทั้งหมดเพื่อหยุดข้อผิดพลาดเหล่านั้นจากการใช้งานเทอร์มินัลของคุณ
rmdir * 2> /dev/null
rmdir * 2>/dev/null || trueโดยวิธีการที่คุณยังสามารถใช้ (วิธีค้นหา (1)ดีกว่าสำหรับการเขียนสคริปต์ แต่ด้วยเหตุผลอื่น: เพราะเป็นการแสดงออกถึงสิ่งที่ดีกว่าที่คุณต้องการทำ)
$HOMEฉันมักจะทำเช่นนี้ ด้วยรอยยิ้มอันชั่วร้าย
find . -type d -empty -delete -maxdepth 1
foo/เพราะว่าถ้าคุณเพียงต้องการที่จะลบไดเรกทอรีย่อยโดยตรงของ
$ tree
.
├── empty_dir1
├── empty_dir2
├── subdir1
│ ├── file1.abc
│ └── file2.abc
└── subdir2
├── file1.abc
└── file2.abc
4 directories, 4 files
$ python -c 'import os;empty=[r for r,s,f in os.walk(".") if not f and not s and r != "." ];map(lambda x: os.rmdir(x),empty)'
$ tree
.
├── subdir1
│ ├── file1.abc
│ └── file2.abc
└── subdir2
├── file1.abc
└── file2.abc
วิธีนี้ใช้ได้ผล:
os.walk()ฟังก์ชั่นในการเดินทรีไดเรกทอรีซ้ำ ในการวนซ้ำแต่ละครั้งrจะถูกตั้งค่าเป็นโฟลเดอร์ปัจจุบันที่เรากำลังเข้าถึงอยู่sมีรายการไดเรกทอรีภายในrและfจะมีรายการไฟล์ในโฟลเดอร์นั้น แน่นอนถ้าfและsที่ว่างเปล่าเรารู้ว่าrเป็นที่ว่างเปล่าemptyรายชื่อของไดเรกทอรีทั้งหมดที่ว่างเปล่าตามการประเมินผลที่ระบุข้างต้นmap()จะใช้ในการดำเนินการos.rmdir()ในแต่ละรายการในemptyรายการ รายการความเข้าใจสามารถนำมาใช้เป็นทางเลือกในฐานะสคริปต์นี้จะเป็นเช่นนั้น:
#!/usr/bin/env python
import os
empty=[]
for r,s,f in os.walk("."):
if not f and not s and r != ".":
empty.append(r)
for i in empty:
os.rmdir(i)
/bin/shอย่างเดียวและ Python เป็นภาษาที่สง่างามยิ่งกว่าภาษาทั้งสอง