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
下面的脚本是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
绝对完美的改编,非常感谢您抽出宝贵时间。 – 2011-03-09 21:08:07
如果任何名称包含'!',这将失败。可以通过在循环中打开和关闭延迟扩展来解决。 – dbenham 2014-12-08 13:13:17