सवाल विंडोज़ में रिक्त निर्देशिका को रिकर्सली हटाएं


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

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


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
सुनिश्चित करें कि यह वास्तव में खाली है। एक छुपा डेस्कटॉप.ini अभी भी एक फाइल माना जाता है। thumbs.db के समान। यदि आप यह सत्यापित करना चाहते हैं कि यह काम करता है, तो निर्देशिकाओं के साथ एक परीक्षण निर्देशिका बनाएं जो खाली और आबादी वाले हैं। यह काम करता है, मैंने सत्यापित किया है। - caliban
हां। यह काम करता हैं। मेरी गलती। - EBGreen
के लिए / f% d में ('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
@ अरजन मैंने इसका परीक्षण किया है, और यह पूरी तरह से काम करता है! अपने काम को समझने के लिए, खाली फ़ाइलों को छोड़कर, और फिर बाएं-पीछे खाली फ़ोल्डर्स को हटाकर, सभी फ़ाइलों को अलग-अलग स्थान पर ले जाने की तरह। /MOVE फ़ाइलों को पहले कॉपी करता है, और उसके बाद प्रतिलिपि बनाने के बाद स्रोत फ़ाइल हटा देता है। ताकि /S इसका उपयोग किया जाता है, यह गैर-रिक्त फ़ोल्डर को गंतव्य (उपर्युक्त मामले में एक ही फ़ोल्डर) पर प्रतिलिपि बनाता है। फिर, यह खाली फ़ोल्डरों को हटा देता है (जैसे, इसकी सोच है कि खाली फ़ोल्डरों की प्रतिलिपि बनाई जा चुकी है)। यह कोई नहीं करता नेस्टेड फ़ोल्डर्स को ले जाएं folder1, क्योंकि ROBOCOPY फ़ोल्डरों को दोबारा स्थानांतरित करता है। - Varun Sharma
यह यूएनसी पथों के साथ भी काम करता है (कम से कम win7 पर)! प्रतिभाशाली ! - Arioch 'The
क्या Robocopy फ़ाइलों को रीसायकल बिन में ले जा सकते हैं? - user598527
यह किसी भी तृतीय-पक्ष सॉफ़्टवेयर की आवश्यकता के बिना एक बहुत ही सुरुचिपूर्ण समाधान है। धन्यवाद! - Marcus Mangelsdorf


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

find . -type d -empty -delete

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

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

16
2017-12-31 22:52



यह अब विंडोज 10 बैश का उपयोग करके भी किया जा सकता है। - March Ho
विंडोज 10 के अपने इंस्टॉलेशन के लिए यह (find . -type d -empty -delete) निम्न त्रुटि के साथ कमांड प्रॉम्प्ट से विफल रहता है: FIND: Parameter format not correct - ImpressTheNet Web Developer


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


6
2017-09-11 16:08



एक-लाइनर बैच फ़ाइल मेरे लिए काम नहीं करती है (मुझे त्रुटि मिलती है "%% d इस समय अप्रत्याशित था।"), और निकालें खाली निर्देशिका प्रोग्राम स्थापित नहीं होगा (यह लिंक किए गए पृष्ठ पर कहता है कि यह नहीं है वैसे भी विंडोज 7 के साथ संगत)। यह कार्यक्रम एक आकर्षण की तरह काम किया। - Phoenix
चूंकि उपयोगकर्ता 36580 नीचे लिखा गया है, "यह संभावना है कि आप सीधे कमांड लाइन से चल रहे हैं। उस स्थिति में, डबल %% को एक% में बदलें" - Lachlan McD.
मुझे यह शुद्ध कमांड लाइन संस्करण पर पसंद है क्योंकि यह आपको हटाए गए चीजों का पूर्वावलोकन करने की अनुमति देता है। आप इसे हमेशा कमांड लाइन से कॉल कर सकते हैं "%~dp0\EmptyFolderNuker.exe" %cd%। - Jeroen Wiert Pluimers


उत्कृष्ट चमकदार उपयोगिताएं यह और अन्य महान सुविधाओं का एक गुच्छा है।


1
2017-09-11 21:32





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

find -type d -exec rmdir {} \;

1
2017-09-11 21:50



जरुरी नहीं। हो सकता है कि केवल खाली उपनिर्देशिका वाले निर्देशिकाएं न हटाएं। आपको इसे उलटना पड़ सकता है। खोज-प्रकार डी -प्रिंट 0 | टीएसी | xargs -0 rmdir - Ryan Thompson
मैं पहले कभी "टीएसी" के बारे में नहीं जानता था। यह वास्तव में निफ्टी है! - Anthony Giorgio
या प्रयोग करें find   (starting-directory)   -depth   -type d ...। -depth विकल्प बताता है find आउटपुट के क्रम को उलट करने जैसा कुछ करने के लिए - यह पहले गहन निर्देशिका स्तर पर जाता है, फिर बैक अप का तरीका काम करता है। - G-Man


यदि आप 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
2018-05-06 14:57



... कृपया मुझे बताएं कि इसे emacs में पूरा करने के लिए आपको यह सब टाइप नहीं करना पड़ेगा। - Hashim
@ हाशिम विचार यह है कि आपने इसे अपने init में परिभाषित किया है और फिर एक कुंजी से बंधे हैं। तकनीकी रूप से मैं इसे बांध सकता था D अगर मैं चाहता था, लेकिन चूंकि मेरे पास इसकी सामान्य आवश्यकता नहीं है, तो मुझे बस टाइप करना होगा M-x *ded RET और बाम-किया। (अगर मुझे हर बार इसे टाइप करना पड़ता है, तो आप बिल्कुल सही हैं कि यह बेतुका होगा - सौभाग्य से यह मामला नहीं है।) - Sean Allred
काफी उचित है, जो अधिक व्यावहारिक लगता है। - Hashim
कर देता है M-x *ded RET कोई महत्व है या यह यादृच्छिक है? यदि उत्तरार्द्ध, आप अपने द्वारा निर्दिष्ट सभी शॉर्टकट्स का ट्रैक कैसे रखते हैं emacs? क्या यादगार पर्याप्त है या क्या आप उन्हें खुद को देखने के लिए पाते हैं? - Hashim
@Hashim *ded पूर्ण फ़ंक्शन नाम का संक्षेप है *-delete-empty-directories। कई समापन इंजन (जैसे आईवी, जो मैं उपयोग करता हूं) इस तरह के अस्पष्ट मिलान को समझते हैं। उन्हें याद रखने के लिए ... मुझे बस इतना नहीं करना है। मेरे द्वारा परिभाषित किए गए कार्यों के साथ शुरू होता है * इसलिए यदि वे किसी कुंजी से बंधे नहीं हैं तो मैं आसानी से उन्हें ढूंढ सकता हूं। अन्यथा, emacs स्वयं ही मुझे बताएगा कि समारोह को कॉल करने का एक तेज़ तरीका था या नहीं। अगर सब कुछ विफल रहता है, तो हमेशा होता है apropos। - Sean Allred


गैरेथ और जी-मैन की पोस्ट का संयोजन:

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

संपादित करें: लेकिन इसने मेरे पाथ 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
2018-04-03 09:20





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

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

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

/ डी - फ़ोल्डर पर काम करेगा, फाइल नहीं / आर - उपनिवेशियों की देखभाल करेगा


0
2017-09-02 23:41