Перемещение файлов/папок в новую структуру

Перемещение файлов/папок в новую структуру

Я хотел бы иметь возможность перемещать папки (и любые подпапки и файлы) из одного места в другое; однако я хочу, чтобы из каждой папки в исходном месте была перемещена только одна конкретная подпапка.

Вот пример моей существующей структуры папок:

E:\Estimates\Estimating Files\E27001
E:\Estimates\Estimating Files\E27001\27001A - Customer1\Drawings
E:\Estimates\Estimating Files\E27001\27001A - Customer1\Costings
E:\Estimates\Estimating Files\E27001\27001B - Customer2\Drawings
E:\Estimates\Estimating Files\E27001\27001B - Customer2\Costings
E:\Estimates\Estimating Files\E27001\27001C - Customer3\Drawings
E:\Estimates\Estimating Files\E27001\27001C - Customer3\Costings
E:\Estimates\Estimating Files\E27002
E:\Estimates\Estimating Files\E27002\27002A - Customer1\Drawings
E:\Estimates\Estimating Files\E27002\27002A - Customer1\Costings

У меня много оценок, как вы видите, некоторые из них имеют один и тот же номер, но другую букву в суффиксе, и имя заказчика, очевидно, меняется.

Я хочу переместить только папки «Рисунки» на новый диск и структуру папок, например, так:

S:\E27xxx\0xx\01\A - Customer1\
S:\E27xxx\0xx\01\B - Customer2\
S:\E27xxx\0xx\01\C - Customer3\
S:\E27xxx\0xx\02\A - Customer1\

Папки «Рисунки» также будут содержать подпапки и файлы, которые я хочу переместить в новое место.

Пока мне удалось создать пустые папки только до этого уровня:

S:\E27xxx\0xx\01\A - Customer1\
S:\E27xxx\0xx\01\B - Customer2\
S:\E27xxx\0xx\01\C - Customer3\
S:\E27xxx\0xx\02\A - Customer1\

с помощью небольшого пакетного файла для всех оценок от 27000 до 30000.

Но перемещение файлов и папок выходит за рамки моих возможностей. Надеюсь, кто-нибудь сможет мне помочь или знает существующую утилиту, которая могла бы это сделать!

Спасибо!

решение1

Я хочу переместить только папки «Рисунки» на новый диск и структуру папок, например, так:

Этот пакетный файл может вам помочь. Он находит все подпапки "Drawings", токенизирует части путей каталогов для построения новой структуры каталогов, затем копирует каждый найденный каталог с подкаталогами, используяRoboCopyинструмент.

ОЧЕНЬ ВАЖНО:

  • Обязательно поместите пакетный файл внутрь "...\Оценка файлов" папку и запустить его оттуда, в противном случае вручную задать sourceDirпеременную.

  • Перед использованием этого скрипта вам следует вручную настроить количество токенов цикла For.

    Например, я использовал эту исходную папку C:\Source\Estimates\Estimating Files, нам нужно пропустить первые четыре токена, потому что мы хотим начать отсчет после части Estimating Files, вот почему я установил Tokens=4,5,6в скрипте ниже, если у вас другой путь, то вам следует скорректировать токены.

    Если ваш исходный каталог — , E:\Estimates\Estimating Filesто вам следует установить параметр tokens следующим образом: Tokens=3,4,5.

  • Если вы хотите автоматически удалить скопированную исходную структуру, просто добавьте a /Moveв параметры RoboCopy.


Исходный код

@Echo OFF

Set "sourceDir=%CD%"
Set "targetDir=C:\Target"

Set "findPattern=Drawings"

For /F "Tokens=4,5,6 Delims=\" %%a In (
    'Dir /B /S /A:D "%sourceDir%\*%findPattern%"'
) Do (
    Call Set "Token1=%%~a"
    Call Set "Token2=%%~b"
    Call Set "Token3=%%~c"
    Call Set "sourcePath=%CD%\%%~a\%%~b\%%~c"
    Call Set "targetPath=%targetDir%\%%Token1%%\%%Token1:~3%%\%%Token2:~3,2%%\%%Token2:~5%%\%%Token3%%"

    Echo+
    Call Echo Source: "%%sourcePath%%"
    Call Echo Target: "%%targetPath%%"

    (Call RoboCopy.exe "%%sourcePath%%" "%%targetPath%%" /E /ZB /COPYALL)1>Nul

)

Pause&Exit /B 0

Выход

Источник: "C:\Source\Estimates\Estimating Files\E27001\27001A - Customer1\Drawings"

Цель: "C:\Цель\E27001\001\01\A - Customer1\Чертежи"

Источник: "C:\Source\Estimates\Estimating Files\E27001\27001B - Customer2\Drawings"

Цель: "C:\Цель\E27001\001\01\B - Customer2\Чертежи"

Источник: "C:\Source\Estimates\Estimating Files\E27001\27001C - Customer3\Drawings"

Цель: "C:\Цель\E27001\001\01\C - Customer3\Чертежи"

Источник: "C:\Source\Estimates\Estimating Files\E27002\27002A - Customer1\Drawings"

Цель: "C:\Target\E27002\002\02\A - Customer1\Drawings"

решение2

Попробуйте этот скрипт. Возможно, вам придется изменить буквы дисков.

setlocal EnableDelayedExpansion
@echo off
Q:
cd "Estimating\Estimating Files"
FOR /D /R %%G IN ("*Drawings*") DO (
FOR /F "tokens=4,5 delims=\" %%H IN ("%%G") DO (
set temp=%%H
set num=!temp:~4,2!
set temp=%%I
set alpha=!temp:~5!
MKDIR "Q:\E27XXX\0XX\!num!\!alpha!\Drawings"
CALL :mover "%%G" !num! !alpha!
)
)

:mover
FOR /R %1 %%X IN (*) DO (
COPY "%%X" "Q:\E27XXX\0XX\%2\%3 %4 %5\Drawings"
)

решение3

Вот окончательный код, который я использовал для копирования папок в новый каталог. Спасибо @ElektroStudios за помощь.

@Echo OFF

Set "sourceDir=%CD%"
Set "targetDir=S:\E30xxx"

Set "findPattern=2 - Drawings"

For /F "Tokens=6,7,8,9 Delims=\" %%a In (
    'Dir /B /S /A:D "%sourceDir%\*%findPattern%"'
) Do (
    Call Set "Token1=%%~a"
    Call Set "Token2=%%~b"
    Call Set "Token3=%%~c"
    Call Set "Token4=%%~d"
    Call Set "sourcePath=%CD%\%%~a\%%~b\%%~c\%%~d"
    Call Set "targetPath=%targetDir%\%%Token1:~3,1%%xx\%%Token2:~4,2%%\%%Token3:~6%%"

    Echo+
    Call Echo Source: "%%sourcePath%%"
    Call Echo Target: "%%targetPath%%"

    (Call RoboCopy.exe "%%sourcePath%%" "%%targetPath%%" /E /ZB /COPYALL)1>Nul

)

Pause&Exit /B 0

Просто пример освоения RoboCoby и токенизации разделенной строки.

Связанный контент