Я хотел бы сравнить две папки, строго по именам файлов. (Не содержимое файла). Я нахожусь на Windows 10 и хотел бы использовать инструменты командной строки.

Вот сценарий, который может объяснить проблему.

Folders
-------
source                  source2 
   - file_1                 - file_1
   - file_2                 - file_2
   - file_3                 - file_4
   - file_5                 - file_5
   - file_6                 - file_7


Output should be:
-----------------
Source  -> Missing files file_4  
Source2 -> Missing files file_3  

Я провел некоторые исследования, и существует множество инструментов diff , но мне не интересно сравнивать содержимое файла. Все, что я хочу, это сравнить две папки и вывести, какие файлы отсутствуют в обеих папках (по сравнению с другой).

Я предпочитаю не использовать Powershell.

Спасибо.

3 ответа3

1

Сделайте dir /b /A-d обеих папок в файле и сравните их с параметрами findstr и /VG:

Учитывая образец дерева:

> tree /f
X:.
│
└───Folders
    ├───source
    │       file_1
    │       file_2
    │       file_3
    │       file_5
    │       file_6
    │
    └───source2
            file_1
            file_2
            file_4
            file_5
            file_7

Следующий пакетный файл:

:: Q:\Test\2019\02\19\SU_1407481.cmd
@echo off

Set "DirA=X:\Folders\source\"
Set "DirB=X:\Folders\source2\"

Dir /B /A-D "%DirA%*" >DirA.txt
Dir /B /A-D "%DirB%*" >DirB.txt

echo file(s) missing in %DirA%
findstr /VG:DirA.txt DirB.txt

echo fil(e) missing in %DirB%
findstr /VG:DirB.txt DirA.txt

дает такой вывод:

> SU_1407481.cmd
file(s) missing in X:\Folders\source\
file_4
file_7
file(s) missing in X:\Folders\source2\
file_3
file_6
0

robocopy (включен в последние версии Windows) может сделать это за один проход:

дано \source\ и \source2\ с некоторыми общими файлами и файлами, которые существуют только в любой папке

robocopy source source2 /L /NJH /NJS /NP /NS

доходность

D:\Users\me\test\source\ *EXTRA Datei only_in_source2.txt Neue Datei only_in_source.txt

где строки, начинающиеся с * обозначают файлы только в source2 (независимо от языка ОС), а другие строки обозначают файлы только в source .

Опции подавляют различные выходные элементы, а /L заботится о том, чтобы различия только указывались, а не копировались.

0

Этот скрипт Powershell делает то, что вы хотите.

$fso = Get-ChildItem -Recurse -path C:\Temp\Source
$fsoBU = Get-ChildItem -Recurse -path C:\Temp\Source2
Compare-Object -ReferenceObject $fso -DifferenceObject $fsoBU

Это и некоторые другие варианты обсуждаются здесь: https://stackoverflow.com/questions/3804109/what-is-the-best-way-to-compare-2-folder-trees-on-windows

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .