2011-03-09 152 views
2

我有許多圖像文件夾,我想創建一個批處理文件,可以查看所有這些目錄及其子目錄,並將每個圖像複製到一個新的文件夾(所有文件相同的文件夾)。我有這個工作使用下面的: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文件,而不需要外部軟件。

感謝您的幫助!

回答

8

這應該適合你。它在擴展後添加一個數字,但您可以輕鬆地將其移到任何地方。我複製了。\ 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

3

下面的腳本是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 
) 
0

或者可以安裝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://stackoverflow.com/a/2372739

相關問題