Переместить несколько файлов с одинаковыми именами в новые папки с именами путей к файлам - PullRequest
0 голосов
/ 29 января 2019

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

В настоящее время у меня есть эта структура:

C:\XYZ\Folder 1\File1.txt
C:\XYZ\Folder 2\File1.txt
C:\XYZ\Folder 3\File1.txt

И я хотел бы, чтобы все файлы File1.txt были перемещены в новые папки, как показано ниже:

F:\Destination\C_XYZ_Folder 1\File1.txt
F:\Destination\C_XYZ_Folder 2\File1.txt
F:\Destination\C_XYZ_Folder 3\File1.txt

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

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

Ответы [ 2 ]

0 голосов
/ 29 января 2019

xcopy имеет переключатель /s для рекурсивного сканирования подпапок.Следующее воссоздает структуру папок (только папки, в которых присутствует file1.txt) до F:\Destination\C\:

xcopy /s "C:\XYZ\file1.txt" "F:\Destination\C\"

копий

C:\XYZ\Folder 1\File1.txt
C:\XYZ\Folder 2\File1.txt
C:\XYZ\Folder 3\File1.txt
C:\XYZ\File1.txt
C:\XYZ\Folder 1\Subfolder\File.txt

до

F:\Destination\C\XYZ\Folder 1\File1.txt
F:\Destination\C\XYZ\Folder 2\File1.txt
F:\Destination\C\XYZ\Folder 3\File1.txt
F:\Destination\C\XYZ\File1.txt
F:\Destination\C\XYZ\Folder 1\Subfolder\File1.txt
0 голосов
/ 29 января 2019

Я предполагаю, что в C:\ есть папка XYZ, в которой есть множество подпапок, и некоторые из них (или все) имеют File1.txt, чтобы создать папку и переместить ее туда, вам может понадобиться:

@echo off
setlocal EnableDelayedExpansion

for /R "C:\XYZ\" %%A IN (File1.txt) do (
    rem /* Find path of file excluded filename (dp=drive and path): */
    set "drive_path=%%~dpA"

    rem /* In this %%~dpA, replace '\' and ':\' according to OP's requirements: */
    set "formatted=!drive_path:\=_!" & set "formatted=!formatted::=!"

    rem /* Make the folder: */
    md "F:\Destination\!formatted!"

    rem /* Move the file there: */
    move "%%~fA" "F:\Destination\!formatted!"
)

Приведенный выше код составляет путь в формате F:\Destination\C_XYZ_etc\File1.txt.Как уже упоминалось в комментариях, вы также можете захотеть:

@echo off
setlocal EnableDelayedExpansion

for /R "C:\XYZ\" %%A IN (File1.txt) do (
    rem /* Find path of file excluded filename (dp=drive and path): */
    set "drive_path=%%~dpA"

    rem /* In this %%~dpA, replace '\' and ':\' according to OP's requirements: */
    set "formatted=!drive_path:\=!" & set "formatted=!formatted::=!"

    rem /* Make the folder: */
    md "F:\Destination\!formatted!"

    rem /* Move the file there: */
    move "%%~fA" "F:\Destination\!formatted!"
)

где это будет в формате F:\Destination\CXYZETC\File1.txt.

Если есть несколько файлов, которые вы хотите проверить: (используя set /p [inputот пользователя]):

@echo off
setlocal EnableDelayedExpansion

:files
set /p files=Please enter the files you want to check separated by spaces. Quote all filenames: 
if not defined files (goto:files)

:loop

rem Loop through user input (filenames):
for %%A IN (%files%) do (
    for /R "C:\XYZ\" %%B IN ("%%A") do (
        rem /* Find path of file excluded filename (dp=drive and path): */
        set "drive_path=%%~dpB"

        rem /* In this %%~dpB, replace '\' and ':\' according to OP's requirements: */
        set "formatted=!drive_path:\=!" & set "formatted=!formatted::=!"

        rem /* Make the folder: */
        md "F:\Destination\!formatted!"

        rem /* Move the file there: */
        move "%%~fB" "F:\Destination\!formatted!"
    )
)

С аргументами (проще):

@echo off
setlocal EnableDelayedExpansion

:argument_check
if [%1] == [] (echo Action requires arguments^^! Please rerun from cmd specifying arguments^^! Remember to quote each filename^^! & exit /b 1)

:loop

rem Loop through arguments (filenames):
for %%A IN (%*) do (
    for /R "C:\XYZ\" %%B IN ("%%A") do (
        rem /* Find path of file excluded filename (dp=drive and path): */
        set "drive_path=%%~dpB"

        rem /* In this %%~dpB, replace '\' and ':\' according to OP's requirements: */
        set "formatted=!drive_path:\=!" & set "formatted=!formatted::=!"

        rem /* Make the folder: */
        md "F:\Destination\!formatted!"

        rem /* Move the file there: */
        move "%%~fB" "F:\Destination\!formatted!"
    )
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...