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 เป็นภาษาที่สง่างามยิ่งกว่าภาษาทั้งสอง