Я манипулирую целой кучей файлов и помещаю их в другой каталог. Теперь мне нужно выяснить, какие файлы находятся в исходном каталоге, а не в выходном (проблема обрабатывается дюжиной компьютеров). Есть ли какой-нибудь скрипт, который я могу запустить в Windows, который будет отображать это?
7 ответов
Используйте WinDiff. Он поставляется с Visual Studio и Platform SDK и может быть загружен отдельно. Это в основном для сравнения файлов, но это также позволяет рекурсивно сравнивать папки.
Если вы ищете ручной процесс и у вас установлена visual studio, то вы можете использовать windiff.exe, чтобы показать различия.
В PowerShell:
$d1 = get-childitem -path $dir1 -recurse
$d2 = get-childitem -path $dir2 -recurse
compare-object $d1 $d2
Я склонен использовать PathSync
FreeCommander делает это быстро. Выберите папку справа, выберите папку слева, сравните. Это удобная утилита.
В 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
Обратите внимание: замените $ ... и # ... # на пути, если вы не знаете, как создавать переменные :)
Вы можете попробовать этот 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