निर्दिष्ट मात्रा में बहुत से सबफ़ोल्डर में पैरेंट फ़ोल्डर से फ़ाइलों को स्थानांतरित करने के लिए स्क्रिप्ट स्क्रिप्ट


1

मुझे एक सिंगल पैरेंट फोल्डर से सभी सबफ़ोल्डर्स में जितनी आवश्यक हो उतने फ़ाइलों को स्थानांतरित करने के लिए एक बैच फ़ाइल स्क्रिप्ट की आवश्यकता है, जब तक कि प्रत्येक सबफ़ोल्डर बैच फ़ाइल में या कमांड लाइन पर निर्दिष्ट फ़ाइलों की अधिकतम मात्रा प्राप्त करता है। दूसरे शब्दों में, स्क्रिप्ट को माता-पिता फ़ोल्डर से सभी फ़ाइलों को इसके नीचे कई सबफ़ोल्डर्स में वितरित करना चाहिए (जो स्क्रिप्ट को स्वचालित रूप से बनाना होगा), फ़ाइलों को बहुत सारी एक्स फ़ाइलों में स्थानांतरित करना (जहां " एक्स " प्रत्येक सबफ़ोल्डर को प्राप्त फ़ाइलों की मात्रा होगी )।

अतिरिक्त आवश्यकताएं:

  1. निम्न नाम के अनुसार सबफ़ोल्डर नाम बनाए जाने चाहिए: 001, 002, 003 और इसी तरह।

  2. सभी प्रकार के फ़ाइलनामों के साथ फ़ाइलों का समर्थन करना चाहिए (रिक्त स्थान के साथ, विशेष वर्ण या गैर-अंग्रेजी उच्चारण के साथ, आदि)।

  3. हजारों फ़ाइलों के दसियों के चलने का समर्थन करना चाहिए।

  4. स्थानीय व्यवस्थापक अधिकारों के तहत विंडोज 10 प्रोफेशनल में काम करना चाहिए।

उदाहरण के लिए, मान लें कि फ़ोल्डर "D: \ Downloads" में 2400 फाइलें हैं, और यह कि आप उन्हें सबफ़ोल्डर्स में वितरित करना चाहते हैं, जिनमें प्रत्येक में 1000 फाइलें हैं। स्क्रिप्ट चलाने के बाद, निम्न संरचना बनाई जाएगी:

D:\Downloads
       |__001
       |__002
       |__003

कहाँ पे:

D:\Downloads --> Will have no files inside it anymore
       |__001 --> Will have 1000 files inside it
       |__002 --> Will have 1000 files inside it
       |__003 --> Will have the last 400 files inside it

फ़ाइलों का क्रम (कौन सी फ़ाइल किस सबफ़ोल्डर में जाती है) महत्वपूर्ण नहीं है, अर्थात, इस कदम को किसी विशिष्ट मानदंड को ध्यान में रखने की आवश्यकता नहीं होगी (जैसे फ़ाइल नाम, आकार, फ़ाइल नाम, आदि)। हालांकि, इस पहलू पर कोई भी सुधार स्वागत योग्य होगा (उदाहरण के लिए, अंतिम निर्मित फ़ाइलों को पहले सबफ़ोल्डर्स में स्थानांतरित करने का विकल्प)।

कोई विचार?


अपडेट करें

यहाँ समाधान है कि मेरे लिए काम किया है:

@echo off
setlocal enableextensions
setlocal enabledelayedexpansion

if not %3.==. goto syntax
if %2.==. goto syntax
:: Checks if %2 is a number:
SET "var="&for /f "delims=0123456789" %%i in ("%2") do set var=%%i
if defined var (goto syntax) 
if /i %1.==. goto syntax
if /i not exist %1 echo. & echo  The folder %1 does not exist... && echo  Folder paths must be typed between "quotes" if there's any empty space. && echo. && goto end

setlocal enableextensions
setlocal enabledelayedexpansion
:: Maximum amount of files per subfolder:
SET limit=%2
:: Initial counter (everytime counter is 1, a new subfolder is created):
SET n=1
:: Subfolder counter:
SET nf=0
::Retrieves the amount of files in the specified folder:
set count=0
for %%A in (%1%\*.*) do set /a count+=1
echo.
echo  Distributing %count% files in subfolders of up to %2 files...
FOR %%f IN (%1%\*.*) DO (
  :: If counter is 1, create a new subfolder with name starting with "00...":
  IF !n!==1 (
    SET /A nf+=1
    MD %1%\00!nf!
  )
  :: Move files into subfolders with names starting with "00...":
  MOVE /-Y "%%f" %1%\00!nf! > NUL
  :: Reset counter when a subfolder reaches the maximum file limit:
  IF !n!==!limit! (
    SET n=1
  ) ELSE (
    SET /A n+=1
  )
)
SET limit=
SET n=
SET nf=
SET count=
echo  Move finished successfully.
goto end

:syntax
echo.
echo  YOU TYPED: movedown %*
echo  SYNTAX: movedown ["full path"] (between quotes if there's any space) [n] (maximum number of files per subfolder)
echo.
:end
ENDLOCAL

नहीं, यह जादू की साइट नहीं है जो एक मुफ्त काम कर रही है। गलत जगह। यहां आप कुछ विशेष सवाल पूछ सकते हैं जब आपने कुछ किया हो, लेकिन कुछ समस्या पर अटक गया हो। फिलहाल, आपके सवाल का अधिक के बजाय फ्रीलांसरों के लिए कोई कार्य असाइनमेंट की तरह लग रहा सवाल
एलेक्स

मैंने कई बार कोशिश की, अलग-अलग तरीकों से, बिना सफलता के। मैंने अपने प्रश्न में अपने सभी प्रयासों का वर्णन इसे बहुत बड़ा नहीं बनाने के लिए किया था और क्योंकि वे सभी गलत रास्ते पर थे ...
रोड्रिगो फॉस्टिनी

अपने प्रयासों को दिखाएं, संकोच न करें, अन्यथा जो लोग आपको समाधान देंगे, उन्हें नीचा दिखाया जाएगा जो उचित नहीं है। एक विचार के रूप में: दो चर बनाइए, एक जो निर्देशिका के नाम को धारण करेगा (कहना dir=001) और दूसरा वह जो फाइलों को गिनता है, प्रत्येक moveकमांड के बाद इसे बढ़ाता है , जब यह 1000 के बराबर होता है, तो इसे 1 पर रीसेट करें, एक और चर बढ़ाता है (dir) ) जो निर्देशिका नाम रखता है और इसे तब तक करता है जब तक सभी फाइलें स्थानांतरित नहीं हो जातीं।
एलेक्स

धन्यवाद, एलेक्स! आपकी टिप समाधान के लिए आधार थी।
रॉड्रिगो फॉस्टिनी

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