Windows में खाली निर्देशिकाओं को पुन: हटाएं


93

मेरे पास मेरी विंडोज 7 मशीन पर एक निर्देशिका है जो सैकड़ों हैं यदि हजारों उप-निर्देशिका नहीं हैं। उनमें से कुछ के पास फाइलें हैं, कुछ के पास नहीं हैं। मैं सभी खाली निर्देशिकाओं को हटाना चाहता हूं।

डेल और rmdir डॉस कमांड को देखते हुए, ऐसा नहीं लगता है कि आप सभी फ़ाइलों को हटाने के बिना पुनरावृत्ति कर सकते हैं। क्या कमांड लाइन से ऐसा करने का कोई तरीका है?


मैं हैरान हूं कि इस सवाल का कोई आसान जवाब नहीं है।
बिल्वपत्र

@bpg: सरल के रूप में यह मिल सकता है xcopy FROMDIR TODIR /s:। इस SO उत्तर को देखें: stackoverflow.com/a/14742810
ग्रहण करें

1
XCOPY निर्देशिकाओं को हटाता है?
बिलप्रेस

1
इसे ROBOCOPY का उपयोग करके आसानी से किया जा सकता है। विवरण के लिए नीचे मेरा उत्तर देखें।
वरुण शर्मा

जवाबों:


115

आप Remove Empty निर्देशिकाएँ उपयोगिता का उपयोग कर सकते हैं ।

वैकल्पिक रूप से आप इस वन-लाइनर बैच फ़ाइल ( DownloadSquad से ) का उपयोग कर सकते हैं :

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

(यदि बैच फ़ाइल के अंदर उपयोग किया जाता है, तो %dसाथ बदलें %%d)

यह काम करता है क्योंकि rdफ़ाइलों को शामिल करने वाली निर्देशिका को नहीं निकालेगा।


6
PS मेरा सुझाव है कि आप किसी भी कमांड-लाइन कमांड को आजमाने से पहले GUI- आधारित टूल को आजमाएं, जो सभी फाइलों को संभावित रूप से डिलीट कर सकता है।
कैलिबन

1
सुनिश्चित करें कि यह वास्तव में खाली है। एक छिपा हुआ Desktop.ini अभी भी एक फ़ाइल माना जाता है। thumbs.db के समान। यदि आप यह सत्यापित करना चाहते हैं कि क्या यह काम करता है, तो अंदर निर्देशिकाओं के साथ एक परीक्षण निर्देशिका बनाएं जो खाली और आबाद हैं। यह काम करता है, मैंने सत्यापित किया है।
कैलीबन

1
हां। यह काम करता हैं। मेरी गलती।
ईबीग्रीन

8
for / f% d in ('dir / s / b') rmdir "% d" करना चाहिए क्योंकि rmdir एक गैर-खाली फ़ोल्डर को नहीं निकाल सकता है
seanyboy

1
को देखो stackoverflow.com/a/34025977/694360 संदर्भ मेनू करने के लिए इस कार्यक्षमता जोड़ने के लिए कैसे पता लगाने के लिए।
एमएमजे

49

आप ROBOCOPY का भी उपयोग कर सकते हैं। यह बहुत सरल है और इसका उपयोग बड़े पदानुक्रम के अंदर खाली फ़ोल्डरों को हटाने के लिए भी किया जा सकता है।

ROBOCOPY folder1 folder1 /S /MOVE

यहां स्रोत और गंतव्य दोनों हैं folder1, क्योंकि आपको केवल अन्य फ़ाइलों को अलग-अलग फ़ोल्डर में ले जाने के बजाय खाली फ़ोल्डर को हटाने की आवश्यकता है। /Sविकल्प कॉपी करना (ऊपर के मामले में) खाली फ़ोल्डरों को छोड़ना है। यह तेज भी है क्योंकि फाइलें एक ही ड्राइव के अंदर चली जाती हैं।


1
जादू। तो यह सभी गैर-खाली फ़ोल्डरों को उसी स्थान पर ले जाता है जहां वे पहले से ही थे (इसलिए कुछ नहीं करता?), और खाली फ़ोल्डरों को छोड़ देता है। लेकिन तब: क्यों उन्हें हटाने के परिणाम में लंघन होगा? और क्या यह नेस्टेड फोल्डर में नहीं जाएगा folder1? डरावना, जब तक अच्छी तरह से परीक्षण नहीं किया गया।
अर्जन

3
@ अर्जन मैंने इसका परीक्षण किया है, और यह पूरी तरह से काम करता है!। इसके काम को समझने के लिए, इसकी तरह सभी फ़ाइलों को अलग-अलग स्थान पर ले जाना, खाली फ़ोल्डरों को छोड़कर, और फिर खाली-पीछे के खाली फ़ोल्डरों को हटाना। /MOVEफ़ाइलों को पहले कॉपी करता है, और फिर कॉपी करने के बाद स्रोत फ़ाइल को हटा देता है। तो, जैसा /Sकि प्रयोग किया जाता है, यह गैर-खाली फ़ोल्डरों को गंतव्य के लिए कॉपी करता है (उपरोक्त मामले में समान फ़ोल्डर)। फिर, यह खाली फ़ोल्डरों को हटा देता है (जैसे, इसकी सोच यह है कि खाली फ़ोल्डर्स पहले से ही कॉपी किए गए हैं)। नहीं, यह नेस्टेड फ़ोल्डर्स को स्थानांतरित नहीं करता हैfolder1 , क्योंकि ROBOCOPY फ़ोल्डर्स को पुनरावर्ती रूप से स्थानांतरित करता है
वरुण शर्मा

3
यह UNC रास्तों के साथ भी काम करता है (कम से कम win7 पर)! प्रतिभाशाली !
अरिच

2
यह किसी भी तीसरे पक्ष के सॉफ्टवेयर की आवश्यकता के बिना एक बहुत ही सुंदर समाधान है। धन्यवाद!
मार्कस मैंगेल्सडॉर्फ

1
यह सिर्फ अपना जादू करता है और पूरी तरह से काम करता है। धन्यवाद!
चार्लीडीसी 5

15

चूंकि सिगविन जीएनयू खोजने के साथ आता है, आप ऐसा कर सकते हैं:

find . -type d -empty -delete

या शोर से बचने के लिए जब कोई फ़ोल्डर मौजूद नहीं है:

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

यह अब विंडोज 10 बैश का उपयोग करके भी किया जा सकता है।
मार्च हो

विंडोज 10 की मेरी स्थापना के लिए यह ( find . -type d -empty -delete) निम्नलिखित त्रुटि के साथ कमांड प्रॉम्प्ट से विफल हो जाता है:FIND: Parameter format not correct
ImpressTheNet वेब डेवलपर

7

मुफ्त उपयोगिता EmptyFolderNuker अपनी पसंद के आधार फ़ोल्डर से, यह ठीक करता है। यह उन निर्देशिकाओं को भी हटा देता है जिनमें केवल खाली उप-निर्देशिकाएँ होती हैं।


1
वन-लाइनर बैच फ़ाइल ने मेरे लिए काम नहीं किया (मुझे त्रुटि मिलती है "%% d इस समय अप्रत्याशित था।"), और निकालें खाली निर्देशिका प्रोग्राम स्थापित नहीं होगा (यह लिंक किए गए पृष्ठ पर कहता है कि यह नहीं है वैसे भी विंडोज 7 के साथ संगत)। इस कार्यक्रम ने एक आकर्षण की तरह काम किया।
फीनिक्स

1
जैसा कि user36580 ने नीचे लिखा है, "यह संभावना है कि आप सीधे कमांड लाइन से चल रहे हैं। उस स्थिति में, डबल %% को एक% में बदलें"
लचलान मैकड।

1
मुझे यह शुद्ध कमांड-लाइन संस्करण पर पसंद है क्योंकि यह आपको हटाए गए चीजों का पूर्वावलोकन करने की अनुमति देता है। आप इसे हमेशा कमांड-लाइन से कॉल करके उपयोग कर सकते हैं "%~dp0\EmptyFolderNuker.exe" %cd%
जीरोन विएर्ट प्लिमर्स

1
@ rob-kam "EmptyFolderNuker" का URL अब उपलब्ध नहीं है।
पीटरको

@PeterCo धन्यवाद, अब तय किया गया।
रोब कम

0

यदि आपके पास Cygwin स्थापित है, तो आप ऐसा कर सकते हैं:

find -type d -exec rmdir {} \;

4
जरुरी नहीं। केवल खाली उपनिर्देशिका वाली निर्देशिकाओं को हटा नहीं सकता है। आपको इसका उल्टा करना पड़ सकता है। find -type d -print0 | टैक | xargs -0 rmdir
रयान थॉम्पसन

मैं पहले कभी "टैक" के बारे में नहीं जानता था। यह वास्तव में है!
एंथनी जियोर्जियो

1
या उपयोग करें । विकल्प बताता उत्पादन का क्रम उलटने की तरह कुछ करने के लिए - यह गहरी निर्देशिका स्तरों पहले के लिए चला जाता है, तो अपनी तरह से काम करता है वापस ऊपर। find (starting-directory) -depth -type d ...-depthfind
जी-मैन

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 में इसे पूरा करने के लिए आपको यह सब टाइप नहीं करना पड़ेगा।
हाशिम

1
@ हाशिम विचार यह है कि आपने इसे अपने init में परिभाषित किया है और फिर एक कुंजी से बंधे हैं। तकनीकी रूप से मैं यह Dचाहता था कि अगर मैं चाहता हूं, लेकिन जब से मुझे इसके लिए एक सामान्य आवश्यकता नहीं है, तो मुझे टाइप करना होगा M-x *ded RETऔर बाम करना होगा। (अगर मुझे वास्तव में हर बार यह लिखना है, तो आप बिल्कुल सही कह रहे हैं कि यह बेतुका होगा - सौभाग्य से ऐसा नहीं है।)
सीन एल्रेड

काफी उचित, कि अधिक प्रशंसनीय लगता है।
हाशिम

क्या M-x *ded RETइसका कोई महत्व है या यह यादृच्छिक है? यदि बाद वाला, आपके द्वारा असाइन किए गए सभी शॉर्टकटों का ट्रैक कैसे रखता है emacs? क्या संस्मरण पर्याप्त है या क्या आप खुद को उन्हें देखने के लिए पाते हैं?
हाशिम

1
@ हाशिम *dedफुल फंक्शन नाम का एक संक्षिप्त नाम है *-delete-empty-directories। कई पूर्णता वाले इंजन (जैसे कि आइवी, जिसका मैं उपयोग करता हूं) इस तरह के फजी मिलान को समझते हैं। उन्हें याद रखने के लिए ... मुझे बस करने की ज़रूरत नहीं है। जिन कार्यों को मैंने परिभाषित किया है वे सभी शुरू करते हैं *इसलिए मैं उन्हें आसानी से पा सकता हूं यदि वे एक कुंजी के लिए बाध्य नहीं हैं। अन्यथा, emacs खुद मुझे बताएंगे कि क्या फ़ंक्शन को कॉल करने का एक तेज़ तरीका था। यदि बाकी सब विफल रहता है, तो हमेशा रहता है apropos
सीन एलाड

0

गैरेथ और जी-मैन के पदों का मेल:

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

संपादित करें: लेकिन मेरे PATH संस्करण में 'C' के कारण सुरक्षा त्रुटि दी गई ... इसलिए इसके बजाय:

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

मैं xargs का उपयोग नहीं करता क्योंकि यह एक इनपुट लाइन सीमा (लगभग 1024 लाइनों, मुझे लगता है?) की प्रतीत होती है, जबकि

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

जब तक यह इनपुट है तब तक बस चलता रहता है। यदि आप परिणाम नहीं देखना चाहते और / या इसे तेज़ चलाना चाहते हैं, तो '-v' क्रिया ध्वज को छोड़ दें।


0

हम्म् ... शायद और भी सरल समाधान:

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

इसे उस फ़ोल्डर से शुरू करें जिसे आप खाली फ़ोल्डर हटाना चाहते हैं।

/ d - फ़ोल्डरों पर काम करेगा, न कि फाइलों / r - में सबडिरेस रिकर्व करेगा

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.