5

Я манипулирую целой кучей файлов и помещаю их в другой каталог. Теперь мне нужно выяснить, какие файлы находятся в исходном каталоге, а не в выходном (проблема обрабатывается дюжиной компьютеров). Есть ли какой-нибудь скрипт, который я могу запустить в Windows, который будет отображать это?

7 ответов7

8

Используйте WinDiff. Он поставляется с Visual Studio и Platform SDK и может быть загружен отдельно. Это в основном для сравнения файлов, но это также позволяет рекурсивно сравнивать папки.

1

Если вы ищете ручной процесс и у вас установлена visual studio, то вы можете использовать windiff.exe, чтобы показать различия.

1

В PowerShell:

$d1 = get-childitem -path $dir1 -recurse 
$d2 = get-childitem -path $dir2 -recurse 
compare-object $d1 $d2 
1

Я склонен использовать PathSync

0

FreeCommander делает это быстро. Выберите папку справа, выберите папку слева, сравните. Это удобная утилита.

0

В cygwin

comm <options> <(cd $dir1;find -type <type>|sort)  <(cd $dir2;find -type <type>|sort) |less -S

Команда comm дает три столбца вывода, если вы не подавите их.

Я использовал -S поэтому меньше не переносится, и вы можете ясно видеть столбцы.

опции

  • -23 показывает, что уникально для $ dir1 в первом столбце, подавляет два других столбца
  • -13 показывает, что уникально для $ dir2 во втором столбце, подавляет два других столбца
  • -12 показывает все то же самое между $ dir1 и $ dir2, подавляет первые два столбца

тип

f для просто файлов d для просто каталога или используйте тип дважды с обоими или вообще удалите тип для всего.

В CMD

Примечание не проверял ниже, я предполагаю, что труба работает в CMD.

Если вы получили здесь findutils и coreutils http://gnuwin32.sourceforge.net/packages.html (потому что вам не нужен cygwin) и пакет less (но вы можете использовать > \somepath\file вместо |less -S затем notepad file т. д.).

cd %dir1%
find -type <type> | sort > \somepath\file1
cd %dir2%
find -type <type> | sort > \somepath\file2
comm <options> file1 file2 |less -S

Обратите внимание: замените $ ... и # ... # на пути, если вы не знаете, как создавать переменные :)

0

Вы можете попробовать этот VBScript, не нужно загружать какие-либо вещи.

Set objFS = CreateObject("Scripting.FileSystemObject")
Set d = CreateObject("Scripting.Dictionary")
Set objArgs = WScript.Arguments
strFolderA= objArgs(0)
strFolderB = objArgs(1)
Set objFolder = objFS.GetFolder(strFolderA)
Set objFolder1 = objFS.GetFolder(strFolderB)
For Each strFile In objFolder.Files
    strFileName = strFile.Name
    strFilePath = strFile.Path
    'collect all files and their full paths.
    d.Add strFileName, strFilePath
Next

For Each strFile In objFolder1.Files
    strFileName = strFile.Name
    strFilePath = strFile.Path
    If Not d.Exists(strFileName) Then
        WScript.Echo "Not found in : " & strFolderA & "->" & strFilePath
    End If 
Next

выход

C:\test>dir /B c:\tmp
file
test.bat

C:\test>dir /B c:\tmp1
test.bat

C:\test>cscript //nologo test.vbs c:\tmp1 c:\tmp
Not found in : c:\tmp1->C:\tmp\file

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