Windows批处理文件复制并保留副本

问题描述:

我有许多图像文件夹,我想创建一个批处理文件,可以查看所有这些目录及其子目录,并将每个图像复制到一个新的文件夹(所有文件相同的文件夹)。我有这个工作使用下面的:Windows批处理文件复制并保留副本

md "My new folder" 
for /D %i in (*) do copy "%i\*" ".\My New Folder" 

不过,我也想保持与文件副本(例如,如果文件夹1和文件夹2双方都称为图像001.JPG,我想都复制到新的文件夹)。我对新文件名无所谓!有:

001.jpg 
001(1).jpg 
001(2).jpg 

将是巨大的,但即使是刚刚更名的每一个文件与增量计数,并结束了:

1.jpg 
2.jpg 
3.jpg 
etc 

将被罚款了。我只需要使用标准的.bat/.cmd文件,而不需要外部软件。

感谢您的帮助!

这应该适合你。它在扩展后添加一个数字,但您可以轻松地将其移到任何地方。我复制了。\ src dir中的文件,因为如果源代码与批处理文件处于同一级别,那么批处理文件也会尝试评估test_folder。最好的选择是硬编码test_folder所以它的地方,不会被DIR/S/B被evaulated ...命令

@echo off 
SETLOCAL ENABLEDELAYEDEXPANSION 
set TESTFOLDER=test_folder 
md "%TESTFOLDER%" 

set /a counter=0 
FOR /F "tokens=*" %%i IN ('DIR /S /B /A-D .\src\*') DO FOR /F "tokens=*" %%j IN ('DIR /B "%%i"') DO IF EXIST ".\%TESTFOLDER%\%%j" (
     set /a counter=!counter!+1 
     echo folder: %TESTFOLDER% 
     copy "%%i" ".\%TESTFOLDER%\%%j_!counter!" 
    ) ELSE copy "%%i" ".\%TESTFOLDER%\%%j" 
:eof 
+0

绝对完美的改编,非常感谢您抽出宝贵时间。 – 2011-03-09 21:08:07

+1

如果任何名称包含'!',这将失败。可以通过在循环中打开和关闭延迟扩展来解决。 – dbenham 2014-12-08 13:13:17

下面的脚本是aflat的答案的改进版本。

该脚本需要两个参数:SourcePath TargetPath。

它将递归地将SourcePath及其子文件夹中的所有文件复制到TargetPath,并仅在存在重复时将增加的计数器附加到基本名称。

如果TargetPath已经存在,则会出错,因为可能已经存在具有_n后缀的名称。

如果您想为每个基本名称分别设置一个计数器和/或是否希望能够复制到现有文件夹,则需要做更多工作。

该脚本比aflat的答案更强大。例如,名字!工作得很好。它还以更直接和更高效的方式实现了aflat的算法。

::copyFlat sourcePath TargetPath 
@echo off 
setlocal disableDelayedExpansion 

:: Initialize and validate arguments 
if "%~2" equ "" echo Error: Insufficient arguments>&2&exit /b 1 
set "source=%~f1" 
if not exist "%source%\" echo Error: Source folder "%source%" does not exist>&2&exit /b 1 
set "target=%~f2" 
if exist "%target%\" echo Error: Target folder "%target%" already exists>&2&exit /b 1 

:: Do the work 
md "%target%" 
set /a n=0 
for /r "%source%" %%F in (*) do if "%%~dpF" neq "%target%\" (
    if exist "%target%\%%~nxF" (
    set /a n+=1 
    set "full=%%F" 
    set "name=%%~nF" 
    set "ext=%%~xF" 
    setlocal enableDelayedExpansion 
    copy "!full!" "!target!\!name!_!n!!ext!" >nul 
    endlocal 
) else copy "%%F" "%target%" >nul 
) 

或者可以安装git的庆典(https://git-for-windows.github.io/),并运行以下命令:。

mv --backup=numbered src\*.* destinationFolder 

这将创建一个看起来像FILENAME.EXT文件〜1〜,FILENAME.EXT〜2〜 ... 这可能是够你,在我的情况,我不喜欢丢失原始文件的扩展名,所以你可以在目标文件夹中运行以下重命名:

ls *~ | sed 's/\(.*\)\.\(.*\)\.~\(.*\)~/mv -i & \1.\3.\2/' 

这将打印重命令命令,如下所示: mv filename.ext。〜1〜filename.1。ext

一旦你很高兴你想要执行这些命令,再次运行相同的命令,但管道sh要像这样执行(注意与最终重命名相同的任何现有文件都将被覆盖 - 但是 - 我选项应该保护你):

ls *~ | sed 's/\(.*\)\.\(.*\)\.~\(.*\)~/mv -i & \1.\3.\2/' | sh 

从这个答案(https://*.com/a/2372739