समतल निर्देशिका संरचना


15

मेरे पास फ़ोल्डर्स के भीतर एक गुच्छा फ़ोल्डर है। ऐशे ही

Root Folder
    -- Folder 1
    -- Folder 2
    -- Folder 3
    -- Folder 4

मैं सभी फ़ोल्डरों को ध्वस्त करना चाहता हूं ताकि फ़ोल्डर 1, फ़ोल्डर 2, फ़ोल्डर 3, ... फ़ोल्डर n के अंतर्गत सभी फाइलें रूट फ़ोल्डर के नीचे मौजूद हों।

खिड़कियों में ऐसा करने का सबसे तेज़ तरीका क्या है?


5
यह निर्भर करता है, आप डुप्लिकेट फ़ाइल नामों को कैसे संभालना चाहेंगे?
मार्क एलेन

जवाबों:


19

विशेष उपकरण या स्क्रिप्टिंग का उपयोग करने का कोई कारण नहीं है। बस एक्सप्लोरर में खोज फ़ंक्शन का उपयोग करें।

  1. एक्सप्लोरर में उस फ़ोल्डर को खोलें जिसे आप समतल करना चाहते हैं।
  2. एक नया फ़ोल्डर बनाएं, सभी फ़ाइलों (लेकिन फ़ोल्डर्स नहीं) का चयन करें, और उन्हें उस फ़ोल्डर में खींचें (यह उन फ़ाइलों की दो प्रतियों को प्राप्त करने से बचाएगा)
  3. सर्च बॉक्स में (एड्रेस बार के दाईं ओर) टाइप *करें और एंटर दबाएं।
  4. सूची पॉप्युलेट होने के बाद, राइट क्लिक करें और सभी का चयन करें, फिर राइट क्लिक और कट करें।
  5. मूल फ़ोल्डर में वापस जाने के लिए बैक बटन दबाएं, फिर राइट-क्लिक करें और पेस्ट करें।
  6. यदि आपके पास कोई डुप्लिकेट नाम है, तो आपको संकेत दिया जाएगा कि इससे कैसे निपटें। अपने उपयोग के मामले के लिए सबसे उपयुक्त विकल्प चुनें। (मुझे लगता है कि यह दोनों फाइलों को कॉपी करने के लिए होगा।) फिर से संकेत दिए जाने से बचने के लिए, नीचे की तरफ चेकबॉक्स वाली सभी फाइलों पर इसे लागू करना सुनिश्चित करें।
  7. सभी फ़ोल्डरों का चयन करें, सुनिश्चित करें कि वे चयनित फ़ाइलों की संख्या के बारे में पॉपअप को देखकर खाली हैं, और फिर उन्हें हटा दें।

यदि आपके पास एक स्क्रिप्ट है तो आप इसे शुरू कर सकते हैं और इसे भूल सकते हैं, यह भी किया जा सकता है। बदलने के लिए आदेश mv *\* .बहुत आसान है ( for /r %f in (*.*) do @move "%~f" .) लेकिन मुझे यकीन है कि आप डुप्लिकेट को संभालना चाहेंगे, उन्हें @Nicole हैमिल्टन के उत्तर में पीछे छोड़ने के बिना। डुप्लिकेट के फ़ाइलनाम में एक संख्या को लागू करना शायद इसे करने का सबसे आसान तरीका है।

निम्न बैच फ़ाइल को नोटपैड में कॉपी और पेस्ट करें और इसे "flatten.cmd" के रूप में सहेजें (उद्धरण चिह्नों सहित):

@echo off
cd "%~1"
md tempryfolder
move *.* tempryfolder
for /r %%f in ("*.*") do call :START "%%~f"
for /r /d %%f in (*.*) do rd "%%~f" 
GOTO :EOF
:START
setlocal
If exist "%~n1%~x1" set /a num=2
:LOOP
If exist "%~n1%num%%~x1" (
    set /a num+=1
    goto loop
)
move "%~1" "%~n1%num%%~x1"

स्क्रिप्ट का उपयोग करने के लिए, बस उस फ़ोल्डर को खींचें जिसे आप उसके ऊपर समतल करना चाहते हैं।


1
इसी तरह लेकिन समझने में आसान: superuser.com/a/523854/433830
aparente001

नोट: यह लिपि अनिवार्य रूप से एक कांटा बम है। मैं इसे हजारों सबडायरेक्टरीज और हज़ारों सबफ़ाइल्स के फ़ोल्डर में उपयोग कर रहा हूं और मेमोरी फ़ुटप्रिंट धीरे-धीरे बढ़ रहा है। मुझे नहीं लगता कि मैं OOM मुद्दों में भाग लेने जा रहा हूं, लेकिन यह ध्यान में रखना है।
नजल्ल

@ कोई बात नहीं मुझे विश्वास है कि यह ऐसा कर सकता है, लेकिन मैं अपने कोड को नहीं, बल्कि Microsoft को दोष दूंगा। सब मैं एक बैच फ़ाइल में कई बार एक सबरूटीन कॉल करता हूं। और मैं कभी भी एक से अधिक नहीं चलता हूं: प्रत्येक सबरूटीन पूरा होने तक चलता है, एक समय में केवल एक प्रक्रिया चलती है। हम कितनी मेमोरी का इस्तेमाल करने की बात कर रहे हैं?
trlkly

@trlkly एक बिंदु पर यह 2 जीबी तक बढ़ गया, हालांकि मेरे पास 75,000 फ़ाइलों और हजारों फ़ोल्डरों के साथ फ़ोल्डर्स और सबफ़ोल्डर की एक बड़ी मात्रा थी। इसके कुछ क्षण बाद यह लगभग 8-900 एमबी तक नीचे गिर गया। हालाँकि डुप्लिकेट फ़ाइलों का भार था। मैं एक 7,500 फ़ाइल जावास्क्रिप्ट लाइब्रेरी की 12 प्रतियों को समतल कर रहा था ताकि मैं यह परीक्षण कर सकूं कि कुछ सॉफ़्टवेयर हजारों फ़ाइलों के साथ एक फ़ोल्डर को कैसे संभालेंगे।
नजाल

@Nzall यह मेरे लिए अविश्वसनीय रूप से अजीब है। कुछ भी नहीं स्क्रिप्ट को ऐसा करना चाहिए। यह एक सबरुटीन है जो फ़ाइल को बढ़ाने के लिए एक एकल चर का पुन: उपयोग करता है। मुझे यह पूछना पड़ सकता है कि एसओ या कुछ और पर इस तरह के बड़े मेमोरी उपयोग का क्या कारण हो सकता है।
त्रिकली

11

आप उस फ़ोल्डर में नेविगेट करके विंडोज एक्सप्लोरर में फ्लैट कर सकते हैं जिसे आप समतल करना चाहते हैं और System.Kind:<>folderपरिणामों से फ़ोल्डरों को बाहर करने के लिए खोज रहे हैं ।

फिर आप CTRL + A के साथ सभी फ़ाइलों का चयन कर सकते हैं और उन्हें एक नए फ़ोल्डर में कॉपी और पेस्ट कर सकते हैं। ध्यान दें कि विंडोज एक्सप्लोरर आपसे पूछेगा कि डुप्लिकेट फ़ाइलनाम से कैसे निपटें।

यहाँ छवि विवरण दर्ज करें


1
ध्यान दें कि इस कार्य के लिए आपको संबंधित स्थानीय अनुवाद में "फ़ोल्डर" टाइप करने की आवश्यकता है (उदाहरण के लिए, इतालवी में System.Kind:<>cartella)
JohnKiller

0

यूनिक्स शेल के साथ इस तरह की चीज आसान है। यहाँ आप अपने हैमिल्टन सी शेल ( मुक्त संस्करण सहित ) के साथ क्या कर सकते हैं । आप सिग्विन बैश के साथ कुछ ऐसा ही कर सकते हैं ।

mv *\* .

यदि आपकी निर्देशिका वास्तव में बहुत बड़ी है, तो संभव है कि विंडोज में चाइल्ड प्रोसेस से गुजरने के लिए वाइल्डकार्ड बहुत लंबी कमांड लाइन में हो। (Windows CreateProcess कॉल तर्क सूची को 32K यूनिकोड वर्णों तक सीमित करता है।) लेकिन C शेल की आंतरिक रूप से कोई सीमा नहीं है, इसलिए आप पूरी सूची पर इस तरह से पुनरावृति कर सकते हैं:

foreach i ( *\* )
   mv $i .
end

@ MarkAllen के ऊपर बिंदु के लिए, इस तरह के मान लेते हैं कि कोई डुप्लिकेट नाम नहीं हैं। यदि वहाँ हैं, तो सूची में बाद की प्रतियां पुराने लोगों को अधिलेखित कर देंगी। यदि यह चिंता का विषय है, तो आप फ़ाइलों पर पुनरावृत्ति कर सकते हैं, mv'उन्हें केवल तभी लिखें जब आप ओवर राइटिंग नहीं कर रहे हों। :tऑपरेटर है पूंछ ऑपरेटर-eऑपरेटर है फ़ाइल परीक्षण मौजूद है

foreach i ( *\* )
   if ( -e $i:t ) then
      echo -2 $i not moved because it already exists
   else
      mv $i .
   end
end

यह अभी भी खाली निर्देशिकाओं को छोड़ देता है, जो शायद आप खाली होने के बाद नहीं चाहते हैं। अगर यह मामला हुआ तो अगली पुनरावृत्ति हो सकती है।


Cygwin> mv * का उपयोग करना mv: स्टेट नहीं कर सकता `* ': ऐसी कोई फ़ाइल या निर्देशिका नहीं
अधिक से अधिक पाँच

साइगविन में bash, mv */* .मेरे लिए काम करता है।
निकोल हैमिल्टन

3
कुछ लोगों को UNIXism में तय किया जाता है ... यदि आप वास्तव में विंडोज 7 में स्क्रिप्टिंग करना चाहते हैं, तो पावरशेल है, तो आपको सिग्विन जैसे कुछ फर्जी बैश सिम्युलेटर की आवश्यकता नहीं है।

आपको PowerShell की भी आवश्यकता नहीं है। नियमित कमांड लाइन अभी भी मौजूद है और वही काम कर सकती है। नीचे मेरा जवाब देखें।
trlkly
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.