سؤال بشكل متكرر حذف الدلائل الفارغة في Windows


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

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


80
2017-09-11 13:38


الأصل


أنا مندهش ليس هناك إجابة بسيطة على هذا السؤال. - billpg
billpg: بسيطة لأنها يمكن أن تحصل على: xcopy FROMDIR TODIR /s. انظر هذا الجواب SO: stackoverflow.com/a/14742810 - eckes
XCOPY حذف الدلائل؟ - billpg
يمكن القيام به بسهولة باستخدام ROBOCOPY. انظر إجابتي أدناه للحصول على التفاصيل. - Varun Sharma


الأجوبة:


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

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

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

(في حالة استخدامها داخل ملف دفعي ، استبدل %d مع %%d)

هذا يعمل ل rd لن يقوم بإزالة دليل يحتوي على ملفات.


99
2017-09-11 13:44



ملاحظة: أقترح أن تجرب الأداة القائمة على واجهة المستخدم الرسومية أولاً ، قبل تجربة أي أوامر سطر أوامر يمكن أن تحذف جميع الملفات. - caliban
تأكد من أنها فارغة حقًا. لا يزال يعتبر Desktop.ini المخفي ملفًا. نفس thumbs.db. إذا كنت تريد التحقق مما إذا كان هذا الأمر يعمل أم لا ، فقم بإنشاء دليل اختبار يحتوي على دلائل داخلية فارغة وغير معبئة. كان يعمل ، لقد تحققت. - caliban
نعم. إنها تعمل. غلطتي. - EBGreen
لـ / f٪ d in ('dir / s / b') يجب أن تعمل rmdir "٪ d" حيث لا يمكن لـ rmdir إزالة مجلد غير فارغ - seanyboy
ينظر الى stackoverflow.com/a/34025977/694360 لمعرفة كيفية إضافة هذه الوظيفة إلى قائمة السياق. - mmj


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

ROBOCOPY folder1 folder1 /S /MOVE

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


35
2017-09-13 10:25



سحر. لذلك هذا يتحرك جميع المجلدات غير الفارغة إلى نفس الموقع كانوا بالفعل في (حتى لا يفعل شيئا؟) ، ويتخطى المجلدات الفارغة؟ ولكن بعد ذلك: لماذا يؤدي تخطيها إلى الحذف؟ ولن تحرك هذه المجلدات داخلها folder1؟ مخيف ، ما لم يتم اختبارها بشكل جيد. - Arjan
Arjan لقد اختبرت ذلك ، وأنها تعمل تماما! لفهم عملها ، مثل نقل جميع الملفات إلى موقع مختلف ، باستثناء المجلدات الفارغة ، ثم حذف المجلدات الفارغة خلف اليسار. /MOVEنسخ الملفات أولاً ، ثم حذف الملف المصدر بعد النسخ. مثل /S يتم استخدامه ، فإنه ينسخ المجلدات غير الفارغة إلى الوجهة (نفس المجلد في الحالة أعلاه). ثم يقوم بحذف المجلدات الفارغة (مثل ، تفكيرها بأن المجلدات الفارغة قد تم نسخها بالفعل). لا ، هذا لا نقل المجلدات المتداخلة في folder1، كما تنقل ROBOCOPY المجلدات بشكل متكرر. - Varun Sharma
حتى يعمل مع مسارات UNC (على الأقل على WIN7)! متألق ! - Arioch 'The
هل يمكن أن تنقل Robocopy الملفات إلى سلة المهملات؟ - user598527
هذا هو حل أنيق للغاية دون الحاجة إلى أي برامج طرف ثالث. شكرا لكم! - Marcus Mangelsdorf


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

find . -type d -empty -delete

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

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

16
2017-12-31 22:52



كما يمكن القيام بذلك الآن باستخدام Windows 10 Bash. - March Ho
لتثبيت بلدي من ويندوز 10 هذا (find . -type d -empty -delete) يفشل من موجه الأوامر مع الخطأ التالي: FIND: Parameter format not correct - ImpressTheNet Web Developer


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


6
2017-09-11 16:08



لم يعمل الملف الدفعي أحادي الخطوط بالنسبة لي (تظهر رسالة الخطأ "٪٪ d غير متوقعة في هذا الوقت.") ، ولن يتم تثبيت برنامج Remove Empty Directories (يقول على الصفحة المرتبطة أنه ليس متوافق مع ويندوز 7 على أي حال). هذا البرنامج يعمل مثل السحر. - Phoenix
كما كتب user36580 أدناه ، "من المحتمل أنك تعمل مباشرة من سطر الأوامر. في هذه الحالة ، قم بتغيير ٪٪ المضاعفة إلى٪ واحدة" - Lachlan McD.
يعجبني ذلك عبر إصدار سطر الأوامر النقي لأنه يسمح لك بمعاينة الأشياء التي يتم حذفها. يمكنك دائمًا الاتصال به من سطر الأوامر باستخدام "%~dp0\EmptyFolderNuker.exe" %cd%. - Jeroen Wiert Pluimers


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


1
2017-09-11 21:32





اذا كنت تمتلك سيغوين مثبت ، يمكنك القيام بذلك:

find -type d -exec rmdir {} \;

1
2017-09-11 21:50



ليس بالضرورة. قد لا يؤدي ذلك إلى حذف الدلائل مع الدلائل الفرعية فارغة فقط. قد تضطر إلى عكس ذلك. find -type d -print0 | تاك xargs -0 rmdir - Ryan Thompson
لم أكن أعرف أبدا عن "تاك" من قبل. هذا حقا أنيق! - Anthony Giorgio
او استعمل find   (starting-directory)   -depth   -type d .... ال -depth يقول الخيار find للقيام بشيء مثل عكس ترتيب الإخراج - فإنه يذهب إلى مستويات الدليل الأعمق أولاً ، ثم يعمل في طريقه للخلف. - G-Man


إذا كنت تعمل في emacs (مما يجعل هذه المنصة-agnostic) ، فإن الأعمال التالية:

(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
2018-05-06 14:57



... من فضلك قل لي أنك لن تضطر إلى كتابة كل هذا من أجل إنجاز هذا في إيماكس. - Hashim
Hashim الفكرة هي أنك حددتها في رسالتك ومن ثم مرتبطة بمفتاح. من الناحية الفنية يمكن أن أكون ملزمة ل D إذا كنت أرغب في ذلك ، ولكن بما أنه ليس لدي حاجة مشتركة لهذا ، فكل ما أحتاجه هو الكتابة M-x *ded RET و بام. (إذا كان عليّ فعلاً أن أكتب هذا في كل مرة ، فأنت على حق تمامًا في أن يكون ذلك سخيًا - لحسن الحظ ليس هذا هو الحال). - Sean Allred
عادل بما فيه الكفاية ، وهذا يبدو أكثر معقولية. - Hashim
هل M-x *ded RET لديك أي أهمية أو أنها عشوائية؟ إذا كان هذا الأخير ، كيف يمكنك تتبع جميع الاختصارات التي قمت بتعيينها في emacs؟ هل يكفي الحفظ أم تجد نفسك مضطرًا للبحث عنه؟ - Hashim
Hashim *ded هو اختصار لاسم الوظيفة الكاملة *-delete-empty-directories. العديد من محركات الاكتمال (مثل اللبلاب ، التي استخدمها) تفهم هذا النوع من المطابقة غير الواضحة. أما الحفاظ على حفظها ... فأنا ببساطة لست مضطرًا لذلك. الوظائف التي قمت بتعريفها تبدأ جميعها * حتى أتمكن من العثور عليهم بسهولة إذا لم يكونوا مرتبطين بمفتاح. وإلا ، فإن emacs نفسها سوف تخبرني إذا كان هناك طريقة أسرع لاستدعاء الوظيفة. إذا فشل كل شيء آخر ، فهناك دائمًا apropos. - Sean Allred