批处理脚本可复制txt文档中列出的文件并保留重复项

时间:2018-09-12 23:14:38

标签: batch-file copy text-files

我正在尝试将文本文件中列出的数千个图像文件从多个文件夹复制到一个文件夹。如果所有文件名都不相同,我拥有的脚本将起作用。如何获取重命名重复项或重命名所有重复项的信息?两者都会起作用,因为名称并不重要。

示例列表

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

2 个答案:

答案 0 :(得分:1)

我看到了您遇到的问题。看起来您正在尝试从多个目录传输图像,其中某些包含相同的文件名。如果您希望保留两个文件,则可以使用FOR语句读取文本文件,并将手边的文件从DSC{Count}重命名为1+

使用enabledelayedexpansion,我们可以使用set /a count += 1来计算一个数字并将%%a重命名为一个数字。请记住,我正在使用%%~xa从文本文件中获取每个文件的扩展名。此处更多信息:Parameter Extensions

下面的脚本将读取 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

答案 1 :(得分:0)

在下面的示例中,尽管您仍可以更改所需的格式,但我并未将文件用作jpg的源。相反,我通过您的dir /s目录DCIM查找所有jpg文件。然后,我测试目标目录以查看文件是否存在,如果存在,则在文件末尾添加(n),如果文件不存在,则仅复制文件。这样,您将拥有没有数字增量(重复)的文件。它将不会为每个文件添加数字值。我们只会对重复项执行此操作。

@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"