compara dois diretórios (cada um com vários subdiretórios e pastas) e localiza arquivos que não estão presentes em nenhum deles no Windows

2

Eu quero comparar dois diretórios (incluindo subpastas) para arquivos (por exemplo, imagens) em duas unidades separadas. Eu tenho milhares de arquivos e estão escondidos dentro de subdiretórios e pastas.

Pequeno: exemplo

Vamos dizer em C: o seguinte é uma lista de pastas e arquivos

C:\folder1
          file01.jpeg
          file02.jpeg

C:\folder1\folder2 
          file10.jpeg

C:\folder1\folder2\folder3 
          file04.jpeg
          file05.jpeg

C:\folder1\folder4

          file06.jpeg
          file07.jpeg
          file03.jpeg

D: tem estrutura de pastas semelhante (pode não ser exata, exceto que a pasta 1 é a mesma), mas alguns arquivos podem estar faltando ou adicionais

D:\folder1
          file01.jpeg
          file08.jpeg

D:\folder1\folder2 
          file03.jpeg

D:\folder1\folder2\folder3 
          file04.jpeg

D:\folder1\folder4
          file06.jpeg
          file07.jpeg
          file09.jpeg

Agora eu preciso de maneira rápida (pode ser da linha de comando ou software que pode encontrar arquivos que estão faltando ou adicionais e colocar os arquivos em um novo diretório digamos D: \ diferença

D:\difference
    file02.jpeg 
    file05.jpeg
    file08.jpeg 
    file09.jpeg
    file10.jpeg     
    
por rdorlearn 08.01.2014 / 17:18

2 respostas

5

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 e sdifffolder conforme necessário.
  • Como alternativa, defina spath1 , spath2 e spathdiff 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"
    
por 08.01.2014 / 23:04
3

Se o seu objetivo for simplesmente detectar quais arquivos estão presentes em uma pasta e copiá-los, use um programa de sincronização de arquivos . Há muitas coisas que podem fazer o trabalho.

Um programa de comparação de pastas é definitivamente bom para ter um controle melhor, porque você pode revisar as diferenças e elas geralmente também têm parâmetros de comparação mais refinados. Você indicou que simplesmente deseja copiar os arquivos em vez de obter uma lista ou integrá-los em um script, portanto, um programa GUI provavelmente é ideal para sua situação.

Um dos melhores para esse fim seria WinMerge . Além de permitir comparar o conteúdo de dois diretórios e fornecer vários filtros, como ocultar arquivos idênticos, é extremamente fácil copiar os que você deseja (figura 1).

Ele também é desenvolvido ativamente, para que você possa enviar relatórios de erros e solicitações de recursos . O melhor de tudo, é grátis.

Figura 1 : o WinMerge tem vários métodos para sincronizar arquivos

    
por 08.01.2014 / 22:15