ฉันจะลบไดเรกทอรีว่างเปล่าทั้งหมดในไดเรกทอรีออกจากบรรทัดคำสั่งได้อย่างไร


58

foo/ว่าฉันมีไดเรกทอรีชื่อ โฟลเดอร์นี้มีไดเรกทอรีย่อย ฉันจะลบไดเรกทอรีว่างทั้งหมดในคำสั่งเดียวได้อย่างไร

คำตอบ:


119

ลองคำสั่งนี้:

find . -empty -type d -delete

findคำสั่งที่ใช้ในการค้นหาไฟล์ / ไดเรกทอรีที่ตรงกับเกณฑ์การค้นหาโดยเฉพาะอย่างยิ่งจากเส้นทางที่ระบุในกรณีนี้ไดเรกทอรีปัจจุบัน (จึง.)

-emptyตัวเลือกถือเป็นจริงสำหรับไฟล์ใด ๆ และไดเรกทอรีที่ว่างเปล่า

-type dตัวเลือกถือเป็นจริงสำหรับไฟล์ชนิดที่ระบุ; ในกรณีนี้dหมายถึงประเภทของไฟล์ไดเรกทอรี

-deleteตัวเลือกคือการกระทำที่จะดำเนินการและถือเป็นจริงสำหรับไฟล์ทั้งหมดที่พบในการค้นหา


ฉันคิดว่านี่เป็นวิธีที่ง่ายที่สุดที่จะทำดังนั้นฉันจะไปข้างหน้าและทำเครื่องหมายว่าตอบแล้ว
justingrif

เฮ้บิลฉันพยายามโพสต์คำถามที่คล้ายกันและมันจะไม่ปล่อยให้ฉันเพราะมันบอกว่ามันเป็นคนหลอกลวงดังนั้นฉันหวังว่าคุณอาจจะสามารถตอบฉันได้ที่นี่ ว่าฉันต้องการทำสิ่งเดียวกันข้างต้น แต่ลบไดเรกทอรีทั้งหมดไม่ว่าจะว่างเปล่าหรือไม่
justingrif

3
rm -rf <directory-name>วิธีที่คุณจะลบไดเรกทอรีโดยไม่คำนึงถึงหรือไม่ว่าพวกเขาจะมีที่ว่างเปล่าให้พิมพ์คำสั่งต่อไปนี้: นี่จะเป็นการลบไดเรกทอรีรวมถึงเนื้อหาทั้งหมดรวมถึงไฟล์และไดเรกทอรีย่อย -rตัวเลือกหมายความว่าลบซ้ำในขณะที่-fคำสั่งหมายถึงไม่ได้แจ้งให้ก่อนที่จะลบ หากคุณต้องการให้ระบบแจ้งเตือนก่อนที่จะลบไดเรกทอรี / ไฟล์ให้แทนที่-fตัวเลือกด้วย-iตัวเลือก
Bill

เกิดอะไรขึ้นถ้ามีบางไฟล์ในไดเรกทอรีที่ฉันต้องการเก็บไว้ ดังนั้นฉันต้องการลบไดเรกทอรีทั้งหมดใน / foo / bar / แต่เก็บไฟล์ใด ๆ ที่อาจจะอยู่ในนั้น
justingrif

2
มันเป็นไปได้ที่จะทำเช่นนี้โดยใช้ท่อให้อาหารstdoutของคำสั่งหนึ่ง (เช่นfind) ลงในstdinส่วนของอื่น ๆ (เช่นrm) แต่ต้องระวังให้มากเพราะมันอาจจะเช็ดออกหรือลบไฟล์ / ไดเรกทอรีที่คุณไม่ต้องการที่จะ ลบ! สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการทำสิ่งนี้ให้ดูmanหน้าสำหรับแต่ละคำสั่งเหล่านี้ เพื่อความปลอดภัยให้ทดสอบสิ่งต่าง ๆ ดังกล่าวในไดเรกทอรีชั่วคราวก่อนลองใช้ของจริง
Bill

11

คุณสามารถใช้ประโยชน์จากการrmdirปฏิเสธคำสั่งเพื่อลบไดเรกทอรีที่ไม่ว่างเปล่าและfind -depthตัวเลือกในการสำรวจแผนผังไดเรกทอรีจากล่างขึ้นบน:

find . -depth -exec rmdir {} \;  

(และละเว้นข้อผิดพลาด) หรือผนวก2>/dev/nullเพื่อละเว้นข้อผิดพลาดจริง ๆ

-depthตัวเลือกที่จะfindเริ่มต้นการค้นหาที่ด้านล่างของต้นไม้ไดเรกทอรี

rm -rfจะลบไฟล์ทั้งหมดในไดเรกทอรี (และไดเรกทอรีย่อยและ .... ) และไดเรกทอรีทั้งหมดและทุกอย่าง


8
rmdir *

จะลบไดเรกทอรีว่างทั้งหมด มันจะทำให้เกิดข้อผิดพลาดสำหรับไดเรกทอรีและไฟล์ที่ไม่ว่างทั้งหมดเพื่อหยุดข้อผิดพลาดเหล่านั้นจากการใช้งานเทอร์มินัลของคุณ

rmdir * 2> /dev/null

สิ่งนี้ไม่เหมาะสำหรับการสร้างสคริปต์เนื่องจากจะออกด้วยรหัสสถานะที่ไม่ใช่ศูนย์ แต่ใช้งานได้
the_drow

@the_drow ทำให้ไม่เหมาะสมอย่างไร rmdir * 2>/dev/null || trueโดยวิธีการที่คุณยังสามารถใช้ (วิธีค้นหา (1)ดีกว่าสำหรับการเขียนสคริปต์ แต่ด้วยเหตุผลอื่น: เพราะเป็นการแสดงออกถึงสิ่งที่ดีกว่าที่คุณต้องการทำ)
Alois Mahdal

$HOMEฉันมักจะทำเช่นนี้ ด้วยรอยยิ้มอันชั่วร้าย
Alois Mahdal

เพราะมันจะรายงานความล้มเหลวหากบางไดเรกทอรีไม่ว่างเปล่า
the_drow

เร็วกว่าวิธีค้นหาหรือไม่ มีใครเปรียบเทียบทั้งสองหรือไม่
Xerus

1
find . -type d -empty -delete -maxdepth 1

foo/เพราะว่าถ้าคุณเพียงต้องการที่จะลบไดเรกทอรีย่อยโดยตรงของ


0

วิธีการของ Python

$ 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)

ซับซ้อนเกินไปสำหรับคำถามง่ายๆ :(
nurulhudamustaqim

@nurulhudamustaqim ขึ้นอยู่กับมุมมอง สำหรับผู้ใช้ลีนุกซ์จำนวนมากที่คุ้นเคยกับ Python นี่มันเจียมเนื้อเจียมตัวมาก :) และนอกจากความหลากหลายแล้ว การบริหารระบบที่ทันสมัยไม่ จำกัด เพียงการทุบตีหรือ/bin/shอย่างเดียวและ Python เป็นภาษาที่สง่างามยิ่งกว่าภาษาทั้งสอง
Sergiy Kolodyazhnyy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.