我有很多图像文件夹,我想创建一个可以查看所有这些目录及其子目录的批处理文件,并将每个图像复制到一个新文件夹(同一文件夹中的所有文件)。我使用以下工作:
md "My new folder"
for /D %i in (*) do copy "%i\*" ".\My New Folder"
但是,我还想保留带有重复项的文件(例如,如果folder1和folder2都有名为001.jpg的图像,我想将它们都复制到新文件夹中)。对我来说新文件名是什么并不重要!具有:
001.jpg
001(1).jpg
001(2).jpg
会很棒,但即使只是用增量计数重命名每个文件,最后都是:
1.jpg
2.jpg
3.jpg
etc
也没关系。我需要它只使用标准的.bat / .cmd文件,但没有外部软件。
感谢您的帮助!
答案 0 :(得分:9)
这对你有用。它会在扩展后附加一个数字,但您可以轻松地在任何地方移动它。我从。\ src目录中复制了文件,因为如果源文件与批处理文件处于同一级别,则批处理文件也会尝试评估test_folder。最好的选择是硬编码test_folder,因此它不会被DIR / S / B ...命令
所取代。@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
答案 1 :(得分:8)
以下脚本是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
)
答案 2 :(得分:0)
或者您可以安装git bash(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以执行(请注意任何与最终重命名相同的现有文件将被覆盖 - 但-i选项应该保护你):
ls *~ | sed 's/\(.*\)\.\(.*\)\.~\(.*\)~/mv -i & \1.\3.\2/' | sh
改编自这个答案(https://stackoverflow.com/a/2372739)