ลบไดเรกทอรีว่างเปล่าซ้ำ ๆ ใน Windows


93

ฉันมีไดเรกทอรีบนเครื่อง Windows 7 ของฉันที่มีหลายร้อยถ้าไม่ใช่ไดเรกทอรีย่อย บางคนมีไฟล์บ้างก็ไม่มี ฉันต้องการลบไดเรกทอรีที่ว่างเปล่าทั้งหมด

ดูที่คำสั่ง del และ rmdir DOS มันไม่เหมือนกับที่คุณสามารถทำซ้ำได้โดยไม่ต้องลบไฟล์ทั้งหมด มีวิธีทำเช่นนี้จากบรรทัดคำสั่งหรือไม่


ฉันประหลาดใจที่ไม่มีคำตอบง่ายๆสำหรับคำถามนี้
billpg

@billpg: เรียบง่ายอย่างที่ควรจะเป็น: xcopy FROMDIR TODIR /s. ดูคำตอบ SO นี้: stackoverflow.com/a/14742810
eckes

1
XCOPY ลบไดเรกทอรีหรือไม่
billpg

1
สามารถทำได้อย่างง่ายดายโดยใช้ ROBOCOPY ดูคำตอบของฉันด้านล่างสำหรับรายละเอียด
Varun Sharma

คำตอบ:


115

คุณสามารถใช้ยูทิลิตี้ลบไดเรกทอรีที่ว่างเปล่า

อีกทางเลือกหนึ่งคือคุณสามารถใช้ไฟล์แบ็ตช์หนึ่งซับ (จากDownloadSquad ):

for /f "delims=" %d in ('dir /s /b /ad ^| sort /r') do rd "%d"

(หากใช้ภายในไฟล์แบตช์ให้แทนที่%dด้วย%%d)

วิธีนี้ใช้งานได้เพราะrdจะไม่ลบไดเรกทอรีที่มีไฟล์


6
PS ฉันขอแนะนำให้คุณลองใช้เครื่องมือที่ใช้ GUI ก่อนก่อนลองคำสั่งบรรทัดคำสั่งที่อาจลบไฟล์ทั้งหมดได้
Caliban

1
ตรวจสอบให้แน่ใจว่ามันว่างเปล่าอย่างแท้จริง desktop.ini ที่ซ่อนอยู่นั้นยังถือว่าเป็นไฟล์ เหมือนกับ thumbs.db หากคุณต้องการตรวจสอบว่ามันใช้งานได้สร้างไดเรกทอรีทดสอบกับไดเรกทอรีภายในที่ว่างเปล่าและมีประชากร มันใช้งานได้ฉันได้รับการยืนยันแล้ว
Caliban

1
อ๋อ มันได้ผล. ความผิดพลาดของฉัน.
EBGreen

8
สำหรับ / f% d ใน ('dir / s / b') ทำ rmdir "% d" ควรใช้งานได้เนื่องจาก rmdir ไม่สามารถลบโฟลเดอร์ที่ไม่ว่างออกได้
seanyboy

1
ดูstackoverflow.com/a/34025977/694360เพื่อค้นหาวิธีเพิ่มฟังก์ชันการทำงานนี้ในเมนูบริบท
mmj

49

คุณสามารถใช้ ROBOCOPY มันง่ายมากและยังสามารถใช้เพื่อลบโฟลเดอร์ว่างภายในลำดับชั้นขนาดใหญ่

ROBOCOPY folder1 folder1 /S /MOVE

ที่นี่ทั้งต้นทางและปลายทางเป็นfolder1เพราะคุณเพียงต้องการลบโฟลเดอร์ว่างเปล่าแทนที่จะย้ายไฟล์อื่นไปยังโฟลเดอร์อื่น /Sตัวเลือกคือการข้ามการคัดลอก (ย้ายในกรณีข้างต้น) โฟลเดอร์ว่าง นอกจากนี้ยังเร็วกว่าเมื่อไฟล์ถูกย้ายภายในไดรฟ์เดียวกัน


1
มายากล. ดังนั้นสิ่งนี้จะย้ายโฟลเดอร์ที่ไม่ว่างเปล่าทั้งหมดไปยังตำแหน่งเดียวกันกับที่มีอยู่แล้ว (ไม่ทำอะไรเลยเหรอ) และข้ามโฟลเดอร์เปล่าไปเลย แต่แล้ว: ทำไมการข้ามพวกเขาส่งผลให้เกิดการลบ? และสิ่งนี้จะไม่ย้ายโฟลเดอร์ซ้อนกันในfolder1หรือไม่ น่ากลัวเว้นแต่จะทดสอบอย่างดี
Arjan

3
@Arjan ฉันได้ทดสอบแล้วและมันทำงานได้อย่างสมบูรณ์แบบ! เพื่อให้เข้าใจถึงการทำงานของมันมันก็เหมือนกับการย้ายไฟล์ทั้งหมดไปยังตำแหน่งอื่นยกเว้นโฟลเดอร์ว่างแล้วจึงลบโฟลเดอร์ว่างด้านซ้าย /MOVEคัดลอกไฟล์ก่อนแล้วจึงลบไฟล์ต้นฉบับหลังจากคัดลอก ดังนั้นตามที่/Sใช้มันจะคัดลอกโฟลเดอร์ที่ไม่ว่างไปยังปลายทาง (โฟลเดอร์เดียวกันในกรณีข้างต้น) จากนั้นจะลบโฟลเดอร์ว่าง (เช่นความคิดว่าโฟลเดอร์ว่างถูกคัดลอกไปแล้ว) ไม่มันไม่ย้ายโฟลเดอร์ที่ซ้อนกันเข้าไปfolder1เนื่องจาก ROBOCOPY จะย้ายโฟลเดอร์ซ้ำ ๆ
Varun Sharma

3
มันใช้งานได้กับเส้นทาง UNC (อย่างน้อยใน win7)! ยอดเยี่ยม!
Arioch 'The

2
นี่เป็นโซลูชันที่หรูหรามากโดยไม่จำเป็นต้องมีซอฟต์แวร์ของ บริษัท อื่น ขอขอบคุณ!
Marcus Mangelsdorf

1
นี่เป็นเพียงเวทมนตร์และทำงานได้อย่างสมบูรณ์แบบ ขอบคุณ!
CharleyDC5

15

เนื่องจาก Cygwin มาพร้อมกับ GNU find คุณสามารถทำได้:

find . -type d -empty -delete

หรือเพื่อหลีกเลี่ยงสัญญาณรบกวนเมื่อไม่มีโฟลเดอร์อยู่:

find . -type d -empty -execdir rmdir {} +

สิ่งนี้สามารถทำได้โดยใช้ Windows 10 Bash
March Ho

สำหรับการติดตั้ง Windows 10 ของฉันนี้ ( find . -type d -empty -delete) ล้มเหลวจากพรอมต์คำสั่งโดยมีข้อผิดพลาดดังต่อไปนี้:FIND: Parameter format not correct
ImpressTheNet Web Developer

7

EmptyFolderNukerยูทิลิตี้ฟรีทำสิ่งนี้ได้ดีจากโฟลเดอร์ฐานที่คุณเลือก นอกจากนี้ยังลบไดเรกทอรีเหล่านั้นที่มีไดเรกทอรีย่อยว่างเท่านั้น


1
ไฟล์แบตช์แบบหนึ่งซับไม่ทำงานสำหรับฉัน (ฉันได้รับข้อผิดพลาด "%% d ไม่คาดคิดในเวลานี้") และโปรแกรม Remove Empty Directories จะไม่ติดตั้ง (มันระบุไว้ในหน้าที่เชื่อมโยงซึ่งไม่ใช่ เข้ากันได้กับ Windows 7 ต่อไป) โปรแกรมนี้ทำงานเหมือนมีเสน่ห์
Phoenix

1
ดังที่ผู้ใช้ 36580 เขียนไว้ด้านล่าง "เป็นไปได้ว่าคุณกำลังเรียกใช้โดยตรงจากบรรทัดคำสั่งในกรณีนี้ให้เปลี่ยน %% สองเท่าเป็น% เดียว"
Lachlan McD

1
ฉันชอบสิ่งนี้มากกว่าเวอร์ชั่นบรรทัดคำสั่งล้วนๆเพราะช่วยให้คุณสามารถดูตัวอย่างสิ่งที่ถูกลบได้ "%~dp0\EmptyFolderNuker.exe" %cd%คุณสามารถโทรได้จากบรรทัดคำสั่งโดยใช้
Jeroen Wiert Pluimers

1
@ rob-kam URL สำหรับ "EmptyFolderNuker" ไม่สามารถใช้ได้อีกต่อไป
PeterCo

@ PeterCo ขอบคุณคงตอนนี้
Rob Kam

0

หากคุณติดตั้งCygwinไว้คุณสามารถทำได้ดังนี้:

find -type d -exec rmdir {} \;

4
ไม่จำเป็น. อาจไม่ลบไดเรกทอรีที่มีไดเรกทอรีย่อยที่ว่างเปล่าเท่านั้น คุณอาจต้องย้อนกลับ ค้นหา -type d -print0 | tac | xargs -0 rmdir
Ryan Thompson

ฉันไม่เคยรู้เรื่อง "แทค" มาก่อน นั่นมันช่างดีจริงๆ!
Anthony Giorgio

1
หรือการใช้งาน ตัวเลือกที่บอกจะทำสิ่งที่ชอบกลับคำสั่งของการส่งออก - มันจะไปถึงระดับไดเรกทอรีที่ลึกที่สุดก่อนแล้วทำงานทางกลับขึ้น find (starting-directory) -depth -type d ...-depthfind
G-Man

0

หากคุณกำลังทำงานใน emacs (ทำให้แพลตฟอร์มนี้ไม่เชื่อเรื่องพระเจ้า) ผลงานดังต่อไปนี้:

(defun *-delete-empty-directories (root-directory)
  "Recursively delete empty directories in ROOT-DIRECTORY.

When called from dired, `dired-current-directory' is used for
ROOT-DIRECTORY."

  ;; Interface
  (interactive (list (if (eq major-mode 'dired-mode)
                         (expand-file-name (dired-current-directory))
                       (read-from-minibuffer "Root directory: "))))
  (when (or (null root-directory) (string= "" root-directory))
    (user-error "No root directory provided"))
  (when (called-interactively-p 'interactive)
    (unless (yes-or-no-p (format "Delete all non-empty directories in `%s'? "
                                 root-directory))
      (user-error "Directory `%s' has been left untouched" root-directory)))

  ;; Implementation
  (require 'f)
  (let ((entries (f-directories root-directory)))
    (while entries
      (let ((curdir (car entries)))
        (when (f-directories curdir)
          (*-delete-empty-directories curdir))
        (unless (f-entries curdir)
          (delete-directory curdir)
          (message "Directory deleted: `%s'" curdir))
        (setq entries (cdr entries)))))

... โปรดบอกฉันว่าคุณไม่จำเป็นต้องพิมพ์สิ่งนี้ทั้งหมดเพื่อให้สำเร็จใน emacs
Hashim

1
@Hashim ความคิดคือคุณได้กำหนดไว้ใน init ของคุณแล้วผูกไว้กับคีย์ ในทางเทคนิคแล้วฉันสามารถใช้มันได้Dถ้าฉันต้องการ แต่เนื่องจากฉันไม่ต้องการสิ่งนี้สิ่งที่ฉันต้องพิมพ์คือM-x *ded RETและบำ - ทำ (ถ้าฉันต้องพิมพ์สิ่งนี้ทุกครั้งคุณก็พูดถูกว่าไร้สาระ - โชคดีที่มันไม่ใช่อย่างนั้น)
Sean Allred

ยุติธรรมพอฟังดูน่าเชื่อถือมากขึ้น
Hashim

ไม่M-x *ded RETได้มีความสำคัญใด ๆ หรือจะเป็นแบบสุ่ม? หากหลังคุณติดตามทางลัดทั้งหมดที่คุณกำหนดไว้emacsอย่างไร การท่องจำนั้นเพียงพอหรือคุณคิดว่าคุณต้องค้นหามันหรือไม่?
Hashim

1
@Hashim เป็นคำย่อของชื่อฟังก์ชั่นเต็มรูปแบบ*ded *-delete-empty-directoriesเอนจิ้นที่เสร็จสมบูรณ์จำนวนมาก (เช่นไม้เลื้อยที่ฉันใช้) เข้าใจการจับคู่แบบฟัซซี่ชนิดนี้ สำหรับการทำให้พวกเขาจดจำ ... ฉันไม่จำเป็นต้องทำ ฟังก์ชั่นที่ฉันได้กำหนดไว้จะเริ่มต้นด้วย*ดังนั้นฉันสามารถค้นหามันได้อย่างง่ายดายหากพวกเขาไม่ได้ผูกไว้กับกุญแจ มิฉะนั้น emacs เองจะบอกฉันว่ามีวิธีเรียกใช้ฟังก์ชันที่เร็วขึ้นหรือไม่ aproposถ้าอื่นทั้งหมดล้มเหลวมีเสมอ
ฌอน Allred

0

การรวมโพสต์ของ Gareth's และ G-Man:

find . -depth -type d -empty -execdir rmdir {} +

แก้ไข: แต่นั่นทำให้เกิดข้อผิดพลาดด้านความปลอดภัยเนื่องจาก 'C' ในเส้นทาง var ของฉัน ... ดังนั้นแทนที่จะ:

$find . -depth -type d -empty | while read dir; do (rmdir -v $dir); done

ฉันไม่ใช้ xargs เพราะดูเหมือนว่าจะมีขีด จำกัด บรรทัดอินพุต (ประมาณ 1024 บรรทัดฉันคิดว่า?) ในขณะที่

 while read x; do (command $x); done

แค่เดินต่อไปเรื่อย ๆ ตราบเท่าที่มันมีอินพุตอยู่ ปล่อยแฟล็ก '-v' verbose หากคุณไม่ต้องการเห็นผลลัพธ์และ / หรือต้องการให้ทำงานเร็วขึ้น


0

อืม ... อาจเป็นวิธีที่ง่ายกว่า:

for /d /r %d in (*.*) do rd "%d"

เริ่มต้นจากโฟลเดอร์ที่คุณต้องการลบโฟลเดอร์ว่าง

/ d - จะทำงานกับโฟลเดอร์ไม่ใช่ files / r - จะเรียกคืน subdirs

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.