Пакет Windows - переместить x количество папок + содержимое в другую папку

Я нахожусь в процессе очистки и организации папок NAS.

Однако у меня есть папка с более чем 1800 папками, мне нужно разделить ее на 18 папок, каждая из которых содержит максимум 100 папок. Имя папки, в которую они перемещаются, не имеет значения, но на верхнем уровне должно быть последовательно. Все содержимое папки должно быть перемещено вместе.

Кроме того, мне нужен командный файл, который также отменяет это.

Причина, по которой это необходимо, связана с тем, что программа, которую я использую для индексации и организации своих папок и содержимого папок, не может легко обрабатывать папки с более чем 100 папками.

Я уже пытался сам, но в итоге полностью облажался.


person PeterDB    schedule 08.05.2013    source источник
comment
Вы должны показать некоторые собственные исследования.   -  person Endoro    schedule 09.05.2013


Ответы (2)


Что-то вроде этого?

@ECHO OFF

SET destination=c:\temp\
SET source=c:\windows\system32\
SET dcount=0
SET fcount=0
SETLOCAL ENABLEDELAYEDEXPANSION

MKDIR %destination%dir%dcount%


FOR /f "tokens=*" %%f in ('DIR /b /s /a:d "%source%*"') do (
  SET str=%%f
  SET str=!str:%source%=!
  MKDIR %destination%dir!dcount!\!str!
  COPY %%f %destination%dir!dcount!\!str! 1> NUL
  SET /a fcount=!fcount!+1
  IF !fcount! EQU 100 (
    SET fcount=0
    SET /a dcount=!dcount!+1
    MKDIR %destination%dir!dcount!
  )
)

ECHO DONE.

Очевидно, что источник и место назначения должны быть изменены, и нет никаких попыток проверить работоспособность или изящно выйти из строя из-за ошибок...

ИЗМЕНИТЬ:

Первая версия рекурсивно спускается по всем подкаталогам и перемещает каждый из них в новую структуру, фактически разрушая их внутреннюю вложенность и организацию. Этот второй сохраняет внутреннюю структуру подкаталогов, вложенных в непосредственные подкаталоги исходного каталога... Выбирайте сами.

@ECHO OFF

SET destination=c:\temp\
SET source=c:\windows\system32\
SET dcount=0
SET fcount=0
SETLOCAL ENABLEDELAYEDEXPANSION

MKDIR %destination%dir%dcount%


FOR /f "tokens=*" %%f in ('DIR /b /a:d "%source%*"') do (
  MKDIR %destination%dir!dcount!\%%f
  XCOPY %source%%%f %destination%dir!dcount!\%%f /e /y 
  SET /a fcount=!fcount!+1
  IF !fcount! EQU 100 (
    SET fcount=0
    SET /a dcount=!dcount!+1
    MKDIR %destination%dir!dcount!
  )
)

ECHO DONE.
person 0x90h    schedule 09.05.2013

Это работает в моем ограниченном тесте и создает UNDO.BAT для восстановления папок туда, где они были. Протестируйте его сами, чтобы убедиться, что он делает то, что вам нужно.

Значение num — это количество папок, которые вы хотите в каждой папке верхнего уровня.

f используется для создания холдинговых папок - 001, 002, 003 и т. д.

Запустите его в папке со всеми перемещаемыми подкаталогами.

@echo off
setlocal enabledelayedexpansion
set num=100
set c=0
set f=1001
set folder=%f:~-3%
del undo.bat 2>nul
for /f "delims=" %%a in ('dir /a:d /o:n /b') do (
set /a c=c+1
   md !folder! 2>nul
   move "%%a" !folder!
   echo move "!folder!\%%a" "%cd%" ^& rd !folder! 2^>nul >>undo.bat
    if !c! EQU %num% (
      set c=0
      set /a f=f+1
      set folder=!f:~-3!
    )
)
person foxidrive    schedule 09.05.2013