Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Сравнение файлов в каталогах.

Ответить
Настройки темы
Любой язык - [решено] Сравнение файлов в каталогах.

Аватара для NikolayHAOS

Старожил


Сообщения: 433
Благодарности: 14

Профиль | Отправить PM | Цитировать


Всем доброго времени суток.
Прочитал все похожие темы. но сам что-то дотумкать немогу. Потому прошу о помощи.
Есть два каталога с файлами. например D:\1 и D:\2.
Нужно сравнить файлы из 1 и 2 между собой и удалить все одинаковые из каталога 2
Файлы маленькие по размеру, если возможно сравнение по CRC или MD5, то вообще отлично.

Отправлено: 11:07, 11-11-2013

 

Ветеран


Сообщения: 1259
Благодарности: 861

Профиль | Отправить PM | Цитировать


PowerShell 3.0 и выше:

Код: Выделить весь код
Function Get-FileHash
{
    [CmdletBinding(DefaultParameterSetName = "Path")]
    param(
        [Parameter(Mandatory, ParameterSetName="Path", Position = 0)]
        [System.String[]]
        $Path,

        [Parameter(Mandatory, ParameterSetName="LiteralPath", ValueFromPipelineByPropertyName = $true)]
        [Alias("PSPath")]
        [System.String[]]
        $LiteralPath,

        [ValidateSet("SHA1", "SHA256", "SHA384", "SHA512", "MACTripleDES", "MD5", "RIPEMD160")]
        [System.String]
        $Algorithm="SHA256"
    )

    begin
    {
        # Construct the strongly-typed crypto object
        $hasher = [System.Security.Cryptography.HashAlgorithm]::Create($Algorithm)
    }

    process
    {
        $pathsToProcess = @()

        if($PSCmdlet.ParameterSetName  -eq "LiteralPath")
        {
            $pathsToProcess += Resolve-Path -LiteralPath $LiteralPath | Foreach-Object ProviderPath
        }
        else
        {
            $pathsToProcess += Resolve-Path $Path | Foreach-Object ProviderPath
        }

        foreach($filePath in $pathsToProcess)
        {
            if(Test-Path -LiteralPath $filePath -PathType Container)
            {
                continue
            }

            try
            {
                # Read the file specified in $FilePath as a Byte array
                [system.io.stream]$stream = [system.io.file]::OpenRead($FilePath)

                # Compute file-hash using the crypto object
                [Byte[]] $computedHash = $hasher.ComputeHash($stream)
            }
            catch [Exception]
            {
                $errorMessage = [Microsoft.PowerShell.Commands.UtilityResources]::FileReadError -f $FilePath, $_
                Write-Error -Message $errorMessage -Category ReadError -ErrorId "FileReadError" -TargetObject $FilePath
                return
            }
            finally
            {
                if($stream)
                {
                    $stream.Close()
                }
            }

            # Convert to hex-encoded string
            [string] $hash = [BitConverter]::ToString($computedHash) -replace '-',''

            $retVal = [PSCustomObject] @{
                Algorithm = $Algorithm.ToUpperInvariant()
                Hash = $hash
                Path = $filePath
            }
            $retVal.psobject.TypeNames.Insert(0, "Microsoft.Powershell.Utility.FileHash")

            $retVal
        }
    }
}

Get-ChildItem D:\1,D:\2 -File | Select Name,FullName,@{n="Hash";e={(Get-FileHash $_.FullName -Algorithm MD5).Hash}} | 
    Group Name,Hash | Where Count -ge 2 | Remove-Item -Path {$_.Group.FullName -match "D:\\2\\"}
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:35, 11-11-2013 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для NikolayHAOS

Старожил


Сообщения: 433
Благодарности: 14

Профиль | Отправить PM | Цитировать


Стесняюсь спросить а как этим пользоваться?
Скопировал содержимое в тестовой файл. Поставил расширение BAT и не чего не происходит.

ая-яй в названии темы не то указано, нужно было CMD/BAT.
Приношу свои извинения, видать что-то глюкнуло. Прошу модераторов отредактировать название, так как мне это уже не доступно.

Отправлено: 12:15, 11-11-2013 | #3


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата NikolayHAOS:
Поставил расширение BAT »
Расширение — «.ps1». Должен быть установлен PowerShell 3.0 (включён в комплект Windows Management Framework 3.0; требуется ОС не ниже Windows 7 SP1) и разрешено исполнение локальных скриптов PowerShell (Using the Set-ExecutionPolicy Cmdlet).

Цитата NikolayHAOS:
ая-яй в названии темы не то указано, нужно было CMD/BAT. »
NikolayHAOS, cmd/bat — это что-то из области садомазохизма. Лучше берите ClonesSpy и задавайте ему параметры из пакетного файла.
Это сообщение посчитали полезным следующие участники:

Отправлено: 12:37, 11-11-2013 | #4


Аватара для NikolayHAOS

Старожил


Сообщения: 433
Благодарности: 14

Профиль | Отправить PM | Цитировать


Так... понятно. Спасибо что помогаешь.
Вот что получаю при выполнении.
блин косяк какой то немогу перейти на диск D:\

Создал папку на диске C:\ вот что получил.


Скрип не менял папки 1 и 2 созданы в корне диска D.
В них находятся одинаковые файлы, из папки 2 нечего не удалилось.

Отправлено: 14:10, 11-11-2013 | #5


Аватара для NikolayHAOS

Старожил


Сообщения: 433
Благодарности: 14

Профиль | Отправить PM | Цитировать


В принципе хрен с ним с хешем, а если сравнивать по размеру например.
Вроде в Bat можно так сделать,
Получается: как сравнить содержимое двух папок, файлы по размеру, и удалить одинаковые в одной из них.

Отправлено: 14:29, 11-11-2013 | #6


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


NikolayHAOS, Вам действительно нужен именно скрипт? Для автоматизации, не одноразовое действие?

Отправлено: 15:26, 11-11-2013 | #7


Пользователь


Сообщения: 70
Благодарности: 19

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
for %%f in (d:\2\*.*) do (
  fc "%%f" "d:\1\%%~nxf"|find "FC: различия не найдены"
  if not errorlevel 1 del "%%f"
)
Это сравнит по содержимому. Только файл должен создаваться в кодировке 866 (она же ASCII, она же DOS, она же OEM).

Если достаточно проверки по размеру, то изменим вот так:
Код: Выделить весь код
for %%f in (d:\2\*.*) do (
  for %%F in ("d:\1\%%~nxf") do if %%~zf==%%~zF del "%%f"
)

-------
Разумный человек приспосабливается к миру, неразумный пытается приспособить мир к себе. Поэтому прогресс делают люди неразумные. (Дж. Б. Шоу)


Последний раз редактировалось Гуллипут, 11-11-2013 в 23:51. Причина: Дополнение и исправление

Это сообщение посчитали полезным следующие участники:

Отправлено: 23:40, 11-11-2013 | #8


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата Гуллипут:
Это сравнит по содержимому. »
Гуллипут, вот это я и называю садомазохизмом .

Отправлено: 23:56, 11-11-2013 | #9


Аватара для NikolayHAOS

Старожил


Сообщения: 433
Благодарности: 14

Профиль | Отправить PM | Цитировать


Iska, да скрипт, если бы один раз, то и вручную можно сравнить.
Есть набор файлов содержимое которых обновляется время от времени, но не всех сразу, задача быстренько отсеять не изменившиеся, до того как обратился на форум сравнивал через просмотр в архиваторе , там CRC считается.
Гуллипут кодировка UTF-8, второй вариант (по размеру) отлично отработал, НО какова вероятность изменения файла с сохранением изначального размера? вот и я думаю, а вдруг.

Мобыть кто-то может подсказать почему скрипт, предложенный Kazun, не срабатывает?

Отправлено: 06:56, 12-11-2013 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Сравнение файлов в каталогах.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Поиск и проверка сегодняшних файлов в динамических каталогах rudimko Скриптовые языки администрирования Windows 4 10-09-2012 20:55
CMD/BAT - [решено] Создание файлов в несуществующих каталогах Bruce Wayne Скриптовые языки администрирования Windows 3 26-07-2012 21:35
CMD/BAT - CMD-файл, обеспечивающий обмен файлов в двух каталогах stAlexey Скриптовые языки администрирования Windows 5 23-10-2010 19:46
Прочие - Программа для сравнения файлов в различных каталогах shadowmaster63 Программное обеспечение Windows 3 14-04-2010 10:28
Сравнение файлов Guest Программирование и базы данных 6 24-04-2004 04:47




 
Переход