Um script para mover os arquivos está abaixo ...
Se você quiser apenas ver quais arquivos são iguais / diferentes, use windiff
. Isso pode ajudar na solução de problemas com o script.
Então, para o seu exemplo:
C:> windiff c:\folder1 d:\folder1
O Windiff será aberto e mostrará quais arquivos são:
- Idêntico
- Diferente (indicando qual arquivo é mais recente)
- Apenas para a esquerda (o arquivo existe apenas no "primeiro caminho" (C: \ folder1)
- Apenas para a direita (o arquivo existe apenas no "segundo caminho" (D: \ folder1)
Você pode salvar as descobertas em um arquivo usando a opção de linha de comando: -S
:
-SS N:\path\filename.ext [save list of identical files to filename.ext]
-SD N:\path\filename.ext [save list of different files to filename.ext]
-SL N:\path\filename.ext [save list of left-only files to filename.ext]
-SR N:\path\filename.ext [save list of right-only files to filename.ext]
Além disso, você pode incluir X
com -S
para fechar windiff
depois de escrever a lista assim:
-SRX N:\path\filename.ext [save list of right-only files to filename.ext]
Você pode combinar as listas, portanto, se você quiser uma lista dos arquivos que existem em (qualquer) um dos caminhos:
C:> windiff -SLRX leftrightonly.txt c:\folder1 d:\folder1
Você só pode gerar um arquivo "log" de cada vez, então se você quiser gerar todos os 4 arquivos "log" individuais você teria que executar o windiff 4 vezes:
C:> windiff -SSX same.txt c:\folder1 d:\folder1
C:> windiff -SDX different.txt c:\folder1 d:\folder1
C:> windiff -SLX leftonly.txt c:\folder1 d:\folder1
C:> windiff -SRX rightonly.txt c:\folder1 d:\folder1
Observação: arquivos que existem nos dois caminhos, mas localizados em pastas diferentes, serão exibidos como "leftonly" ou "rightonly".
Se você quiser que um script mova os arquivos existentes em apenas um dos caminhos para uma pasta diferente, use o script em lote abaixo.
Notas:
- Estou chamando um arquivo que existe em apenas um dos caminhos de um arquivo "solitário".
- O script abaixo (com a variável
"domove=0"
) exibirá apenas arquivos "solitários" sem movê-los. Depois de testar o script e ter certeza de que os arquivos corretos serão movidos, você pode alterar o valor para: variável"domove=1"
para que os arquivos "solitários" sejam exibidos e movidos. - No script, defina
sdrive1
,sdrive2
,sfolder
esdifffolder
conforme necessário. - Como alternativa, defina
spath1
,spath2
espathdiff
se isso for mais apropriado para seu uso. - Se desejar, o script pode ser facilmente modificado para aceitar esses caminhos na linha de comando.
Eu fiz as seguintes suposições:
- Para cada arquivo no "primeiro caminho", o "segundo caminho" inteiro é pesquisado por um "nome do arquivo.ext" correspondente.
- Se o arquivo NÃO for encontrado no "segundo caminho" (arquivo solitário), ele será movido para uma pasta "diferença".
- Nenhuma tentativa é feita para comparar arquivos que possuem nomes de arquivos correspondentes, mas essa funcionalidade pode ser facilmente adicionada.
- Nenhuma tentativa é feita para considerar a possibilidade de que vários arquivos possam ter o mesmo nome e estar localizados em diferentes subpastas do "primeiro caminho" (o mesmo para "segundo caminho"). Se isso acontecer em um arquivo "solitário", cada um desses arquivos será movido para a pasta "diferença", sobrescrevendo todos os arquivos movidos anteriormente com o mesmo nome.
- Depois que cada arquivo no "primeiro caminho" é pesquisado dentro do "segundo caminho", o processo é repetido em outra direção, e para cada arquivo no "segundo caminho", todo o "primeiro caminho" é pesquisado para um "filename.ext" correspondente.
Aqui está o script:
@echo off
rem use "domove" for testing
rem if "%domove%" !=1, "lonely" files found will only be displayed (not moved).
rem if "%domove%" =1, "lonely" files found will be displayed and moved.
set "domove=0"
set "sdrive1=C:\"
set "sdrive2=D:\"
set "sfolder=folder1"
set "sdifffolder=difference"
set "spath1=%sdrive1%%sfolder%"
set "spath2=%sdrive2%%sfolder%"
set "spathdiff=%sdrive2%%sdifffolder%"
rem spath1=C:\folder1, spath2=D:\folder1, spathdiff=D:\difference
rem ***************************************************
rem check if "path1" and "path2" exist
if exist "%spath1%" if exist "%spath2%" goto :check2
if not exist "%spath1%" echo Error: Path1:"%spath1%" does not exist.>&2
if not exist "%spath2%" echo Error: Path2:"%spath2%" does not exist.>&2
goto :EOF
:check2
rem check if "path1" is empty (no files)
dir /a-d /s /b "%spath1%">nul 2>&1
if %errorlevel% EQU 0 goto :check3
echo Error: Path1:"%spath1%" is empty (no files).>&2
goto :EOF
:check3
rem check if "path2" is empty (no files)
dir /a-d /s /b "%spath2%">nul 2>&1
if %errorlevel% EQU 0 goto :check4
echo Error: Path2:"%spath2%" is empty (no files).>&2
goto :EOF
:check4
rem check if "%spathdiff%" exists, but is a file (error)
if not exist "%spathdiff%" goto :start
if exist "%spathdiff%\*" goto :start
echo Error: Folder "%spathdiff%" conflicts with a file with the same name.>&2
goto :EOF
:start
rem get a list of all files in "first path", call :work1
rem passing "(path1:)C:\path\...\filename.ext", "filename.ext", and "D:\path2"
for /f "usebackq delims=" %%f in ('dir /s /b /a-d "%spath1%"') do call :work1 "%%~f" "%%~nxf" "%spath2%"
rem reverse the paths:
rem get a list of all files in "second path", call :work1
rem passing "(path2:)D:\path\...\filename.ext", "filename.ext", and "C:\path1"
for /f "usebackq delims=" %%f in ('dir /s /b /a-d "%spath2%"') do call :work1 "%%~f" "%%~nxf" "%spath1%"
rem done, exit
goto :EOF
:work1
set "w1full=%~1"
set "w1file=%~2"
set "wpath2=%~3"
rem "%w1file%" is the "target" "filename.ext" from "first path" to look for (in "second path").
for /f "usebackq delims=" %%g in ('dir /s /b /a-d "%wpath2%"') do call :work2 "%%~nxg" "%w1file%" "w1file"
rem if "target" "filename.ext" from "first path" was found in the "second path",
rem it is now empty. it means:
rem file is somewhere in both paths... no action. go get next file from "first path"
if "%w1file%."=="." goto :EOF
rem at this point, "%w1file%" ("%w1full%") is a "lonely" file
rem "%w1file%" only exists in "path1" move it to "difference" path
rem additional checks might be necessary here
rem to see if this file already exists in "difference" path
if not exist "%spathdiff%" md "%spathdiff%">nul 2>&1
echo Found "lonely" file %w1file%: move "%w1full%" "%spathdiff%"
if %domove% EQU 1 move /y "%w1full%" "%spathdiff%">nul 2>&1
rem you can test %errorlevel% here for error: %errorlevel%=0 if no error
rem go get next file from "first path"
goto :EOF
:work2
rem %1 is "current" "filename.ext" from "second path"
rem %2 is "target" "filename.ext" from "first path"
rem if "target" "filename.ext" is empty, return for more
if "%~2."=="." goto :EOF
rem if file from "first path" is found in "second path",
rem "clear" the variable holding the filename of the "target" "filename.ext" from "first path"
rem additional checks might be necessary here
rem to "compare" the two files
if /I "%~1"=="%~2" set "%~3="
goto :EOF
Aqui está a saída testando o script com o conjunto de arquivos de amostra que você descreveu:
Found "lonely" file file02.jpeg: move "c:\folder1\file02.jpeg" "d:\difference"
Found "lonely" file file10.jpeg: move "c:\folder1\folder2\file10.jpeg" "d:\difference"
Found "lonely" file file05.jpeg: move "c:\folder1\folder2\folder3\file05.jpeg" "d:\difference"
Found "lonely" file file08.jpeg: move "d:\folder1\file08.jpeg" "d:\difference"
Found "lonely" file file09.jpeg: move "d:\folder1\folder4\file09.jpeg" "d:\difference"