Пакетный скрипт для копирования файлов, перечисленных в текстовом документе и хранения дубликатов - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь скопировать тысячи файлов изображений, перечисленных в текстовом файле, из нескольких папок в одну папку. Сценарий у меня работает, если все имена файлов были разными. Как мне заставить его переименовать дубликаты или переименовать их все? Либо будет работать, так как имя не важно.

Пример списка

G:\research_data\an\an01\DCIM\100MSDCF\DSC04450.JPG
G:\research_data\an\an01\DCIM\100MSDCF\DSC04076.JPG
G:\research_data\an\an01\DCIM\100MSDCF\DSC03141.JPG
G:\research_data\an\an01\DCIM\120MSDCF\DSC04840.JPG
G:\research_data\an\an02\DCIM\100MSDCF\DSC04450.JPG
G:\research_data\an\an02\DCIM\112MSDCF\DSC04076.JPG
G:\research_data\an\an03\DCIM\102MSDCF\DSC03141.JPG
G:\research_data\an\an03\DCIM\105MSDCF\DSC04450.JPG
G:\research_data\an\an03\DCIM\106MSDCF\DSC04076.JPG

Код:

@echo off
for /f "tokens=* delims=" %%a in ('type "L:\an_2017\image_list.txt"') do xcopy /hrkvy "%%a" "L:\an_2017"
pause

Ответы [ 3 ]

0 голосов
/ 13 сентября 2018

В моем примере ниже, я не использую файл в качестве источника для JPG, хотя вы все еще можете изменить, что вы хотите.Вместо этого я dir /s через ваш каталог DCIM нахожу все файлы jpg.Затем я проверяю каталог назначения, чтобы увидеть, существует ли файл, если он существует, я увеличиваю его на (n) в конце, если он не существует, я просто копирую файл.Таким образом, у вас будут файлы без числовых приращений (duplciates). Он не будет добавлять числовые значения к каждому файлу.Мы сделаем это только для дубликатов.

@echo off
setlocal enabledelayedexpansion
set "source=G:\research_data\an\an01\DCIM\"
set "dest=L:\an_2017\"
set /a cnt=0
for /f "tokens=*" %%a in ('dir /S /B /A-D "%source%*.jpg"') do for /f "tokens=*" %%b in ('dir /B "%%a"') do if exist "%dest%\%%b" (
        set "ext=%%~xa"
        set "fname=%%~na"
        if exist "%dest%\!fname!(!cnt!)!ext!" (set /a cnt=!cnt!+1)
        set /a cnt=!cnt!+1
        copy "%%a" "%dest%\!fname!(!cnt!)!ext!"
) else copy "%%a" "%dest%\%%b"
0 голосов
/ 13 сентября 2018
@echo off
setlocal

set "source=L:\an_2017\image_list.txt"
set "target=L:\an_2017"

for /f "delims=" %%A in (%source%) do (
    if not exist "%target%\%%~nxA" (
        copy "%%~A" "%target%\%%~nxA"
    ) else (
        call :index "%%~A" "%target%\%%~nxA" "1"
    )
)

exit /b

:index  source, target, count
setlocal
set /a "cnt=%~3"

if exist "%target%\%~n2(%cnt%)%~x2" (
    call :index "%~1" "%~2" "%cnt%+1"
) else copy "%~1" "%target%\%~n2(%cnt%)%~x2"

Исходный файл читается построчно.Если файл не найден в целевой папке, то копирование выполнено.Если файл найден в цели, то метка :index вызывается с аргументами источника, цели и счетчиком 1.

В вызываемой метке cnt устанавливается значение счетчика,Если индексированный файл не найден в целевом объекте, выполняется копирование.Если найдено в target, снова вызывается метка до тех пор, пока индексированный файл не будет найден в target и не будет выполнена копия.

Если вы предпочитаете использовать type, тогда замените (%source%) на ('type "%source%"').

Примечание: Целочисленное значение индекса основано на 1 и перезапускается с 1 для индексации и увеличивается до тех пор, пока имя файла не окажется в цели.

0 голосов
/ 13 сентября 2018

Я вижу проблему, с которой вы столкнулись. Похоже, вы пытаетесь перенести изображения из разных каталогов, в некоторых из которых содержатся одинаковые имена файлов. Если вы хотите сохранить оба файла, вы можете использовать оператор FOR для чтения вашего текстового файла и переименовать файл под рукой в ​​DSC{Count} из 1+.

Используя enabledelayedexpansion, мы можем использовать set /a count += 1 для подсчета одного числа и переименования %%a в число. Пожалуйста, имейте в виду, что я использую %%~xa, чтобы получить расширение каждого файла из текстового файла. Более подробная информация здесь: Расширения параметров

Сценарий ниже будет читать все расположения файлов в файле image_list.txt и копировать каждый элемент в целевой каталог с новым именем DSC1-DSCinfinity в зависимости от того, сколько элементы находятся в image_list.txt . Это позволяет избежать проблем с повторяющимися именами в текстовом файле.

@ECHO OFF
@setlocal enableextensions enabledelayedexpansion

rem configure directories
set "source=L:\an_2017\image_list.txt"
set "target=L:\an_2017"

rem rename files to DSC{Count}
set /a count = 1
for /f "tokens=* delims=" %%a in ('type "%source%"') do (

copy "%%a" "%target%\DSC!count!%%~xa"
set /a count += 1

)

goto :EOF
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...