it-swarm.asia

بشكل متكرر حذف الدلائل الفارغة في ويندوز

لدي دليل على جهاز Windows 7 يحتوي على مئات إن لم يكن الآلاف من الأدلة الفرعية. بعض منهم لديهم ملفات ، والبعض الآخر لا. أريد حذف جميع الدلائل الفارغة.

عند النظر إلى الأمر del و rmdir DOS ، لا يبدو أنه يمكنك القيام بذلك بشكل متكرر دون حذف جميع الملفات. هل هناك طريقة للقيام بذلك من سطر الأوامر؟

87
mohlsen

يمكنك استخدام إزالة الدلائل الفارغة الأداة المساعدة.

بدلاً من ذلك ، يمكنك استخدام هذا الملف الدفعي ذو الخط الواحد (من DownloadSquad ):

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

(إذا تم استخدامه داخل ملف دفعي ، فاستبدل %d بـ %%d)

يعمل هذا لأن rd لن يزيل الدليل الذي يحتوي على ملفات.

106
caliban

يمكنك أيضا استخدام ROBOCOPY. إنه بسيط للغاية ويمكن استخدامه أيضًا لحذف المجلدات الفارغة داخل التسلسل الهرمي الكبير.

ROBOCOPY folder1 folder1 /S /MOVE

هنا المصدر والوجهة كلاهما folder1 ، حيث تحتاج فقط إلى حذف المجلدات الفارغة ، بدلاً من نقل الملفات الأخرى إلى مجلد مختلف. الخيار /S هو تخطي نسخ المجلدات الفارغة (نقل ، في الحالة أعلاه). كما أنه أسرع حيث يتم نقل الملفات داخل نفس محرك الأقراص.

41
Varun Sharma

نظرًا لأن Cygwin يأتي مع GNU find ، يمكنك القيام بذلك:

find . -type d -empty -delete

أو لتجنب الضوضاء عند عدم وجود مجلد:

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

الأداة المساعدة المجانية EmptyFolderNuker يقوم بهذا بشكل جيد ، من مجلد أساسي من اختيارك. كما أنه يزيل تلك الدلائل التي تحتوي فقط على أدلة فرعية فارغة.

6
Rob Kam

ممتازة Glary Utilities لديها هذا ومجموعة من الميزات الرائعة الأخرى.

1
outsideblasts

إذا كنت تعمل في 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)))))
0
Sean Allred

هممم ... ربما حتى حل أبسط:

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

ابدأ هذا من المجلد الذي تريد حذف المجلدات الفارغة منه.

/ d - سيعمل على المجلدات ، وليس الملفات/r - سوف يعيد تمثيل subdirs

0
Daniel Mošmondor

الجمع بين منشورات Gareth's و G-Man:

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

تحرير: لكن هذا أعطى خطأ أمان بسبب "C" في PATH var ... لذا بدلاً من ذلك:

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

لا أستخدم xargs لأنه يبدو أن هناك حد لسطر الإدخال (حوالي 1024 سطرًا ، على ما أعتقد؟) ، في حين أن

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

يبقى فقط على الاستمرار طالما أنه يحتوي على مدخلات. اترك علامة المطوّل '-v' إذا كنت لا تريد رؤية النتائج و/أو تريد تشغيلها بشكل أسرع.

0
skeetastax

إذا كان لديك Cygwin مثبتًا ، فيمكنك القيام بذلك:

find -type d -exec rmdir {} \;
0
Anthony Giorgio