Введение

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

Для таких случаев можно использовать встроенный PowerShell 5.1 и простой скрипт, который:

  • ищет дубликаты строго по содержимому файла (не по имени и не по дате);
  • сравнивает файлы из двух каталогов;
  • в "dry run" режиме показывает список совпадений;
  • в "live" режиме удаляет дубликаты из второго каталога (в корзину, с возможностью восстановления).

Как работает скрипт

Алгоритм предельно простой и надёжный:

  1. Файлы обоих каталогов фильтруются по расширениям (jpg, png, mp4 и др.).
  2. Для каждого файла в "основном" каталоге считается размер и SHA1-хэш содержимого.
  3. Файлы из второго каталога проверяются по тем же признакам.
  4. Если совпадает и размер, и хэш, это гарантированно один и тот же файл.
  5. Дубликаты показываются на экране (dry run) или удаляются (live).

Подготовка

  • Скрипт работает в Windows PowerShell 5.1 (это версия по умолчанию в Windows 10/11).
  • Запускать его удобно через PowerShell ISE (F5).
  • Никаких сторонних библиотек или модулей не требуется.

Использование

1. Скопируйте код скрипта (см. ниже) в новый файл PowerShell ISE.
2. В начале файла укажите пути к каталогам:

  • DirA — эталонная папка (в ней ничего не трогаем);
  • DirB — папка-кандидат (в ней ищем и удаляем дубли).
    3. Настройте флаг:
  • $LIVE = $false — просто посмотреть список дублей (режим по умолчанию);
  • $LIVE = $true — удалить дубликаты из DirB (отправляются в корзину).
    4. Нажмите F5 для запуска.
    5. В консоли отобразятся:
  • информация о количестве файлов и совпадениях;
  • таблица найденных дублей (ограничена первыми 100 записями);
  • предупреждение о том, был ли запуск в dry run или live.

Ограничения

  • Проверка идёт строго побайтно (Size + SHA1).
    Это значит: если фото пересохранено с другим качеством или повернуто — оно будет считаться другим файлом.
  • В режиме live все файлы из DirB, определённые как дубли, перемещаются в Корзину (а не безвозвратно удаляются).

Код скрипта

# ============================================
# Duplicate Finder (Exact match by Size+SHA1)
# Windows PowerShell 5.1 - no params, no logs
# ============================================

# -------- USER SETTINGS (edit these lines) --------
$DIR_A = "C:\1"         # Reference folder (will NOT be modified)
$DIR_B = "C:\2"         # Candidates (duplicates here may be removed in LIVE mode)
$LIVE  = $false             # $false = preview only; $true = delete duplicates from DirB (Recycle Bin)
$EXTENSIONS = @(".jpg",".jpeg",".png",".gif",".tif",".tiff",".bmp",".heic",".webp",
                ".mp4",".mov",".avi",".mkv",".mts",".m2ts",".3gp",".wmv")
$PREVIEW_MAX = 100          # How many rows to print in preview
# --------------------------------------------------

# Console helpers
function Write-Info($msg)  { Write-Host "[INFO ] $msg" }
function Write-Warn($msg)  { Write-Host "[WARN ] $msg" -ForegroundColor Yellow }
function Write-Err ($msg)  { Write-Host "[ERROR] $msg" -ForegroundColor Red }

# Send to Recycle Bin (PS 5.1 / .NET Framework)
function Remove-ToRecycleBin {
    param([string]$Path)
    try {
        Add-Type -AssemblyName Microsoft.VisualBasic -ErrorAction SilentlyContinue | Out-Null
        $UIOption      = [Microsoft.VisualBasic.FileIO.UIOption]::OnlyErrorDialogs
        $RecycleOption = [Microsoft.VisualBasic.FileIO.RecycleOption]::SendToRecycleBin
        [Microsoft.VisualBasic.FileIO.FileSystem]::DeleteFile($Path, $UIOption, $RecycleOption)
        return $true
    } catch { return $false }
}

# Enumerate files by extension
function Get-FilesByExtensions {
    param([string]$Root, [string[]]$Extensions)
    if (-not (Test-Path -LiteralPath $Root)) { throw "Path not found: $Root" }
    $extSet = New-Object 'System.Collections.Generic.HashSet[string]'
    foreach ($e in $Extensions) { if ($e) { $extSet.Add($e.ToLowerInvariant()) | Out-Null } }
    $files = Get-ChildItem -LiteralPath $Root -Recurse -File -ErrorAction SilentlyContinue
    $list = New-Object System.Collections.Generic.List[System.IO.FileInfo]
    foreach ($f in $files) {
        $ext = [System.IO.Path]::GetExtension($f.Name)
        if ($ext -and $extSet.Contains($ext.ToLowerInvariant())) { $list.Add($f) | Out-Null }
    }
    return $list
}

# Compute SHA1 with basic retry (handles transient IO locks)
function Get-FileSHA1 {
    param([string]$Path)
    for ($r=0; $r -lt 2; $r++) {
        try {
            return (Get-FileHash -Path $Path -Algorithm SHA1).Hash
        } catch {
            Start-Sleep -Milliseconds 100
        }
    }
    throw "Failed to hash: $Path"
}

# ---- Main ----
try {
    $DirA = (Resolve-Path -LiteralPath $DIR_A).Path
    $DirB = (Resolve-Path -LiteralPath $DIR_B).Path
} catch {
    Write-Err $_.Exception.Message
    return
}

if ($DirA.TrimEnd('\') -ieq $DirB.TrimEnd('\')) {
    Write-Err "DirA and DirB must be different."
    return
}

Write-Info "DirA: $DirA"
Write-Info "DirB: $DirB"
Write-Info ("Mode: {0}" -f ($(if ($LIVE) { "LIVE (will delete duplicates from DirB -> Recycle Bin)" } else { "DRY (no deletion)" })))
Write-Info "Match method: Exact Size + SHA1"
Write-Info "Scanning DirA..."
$filesA = Get-FilesByExtensions -Root $DirA -Extensions $EXTENSIONS
Write-Info ("DirA files: {0}" -f $filesA.Count)

Write-Info "Indexing DirA by Size..."
# Map: size -> list of { Path, SHA1 }
$mapA = @{}
$i = 0
foreach ($f in $filesA) {
    $i++
    if ($i % 300 -eq 0) { Write-Host ("  ...{0}/{1}" -f $i, $filesA.Count) }
    $size = $f.Length
    if (-not $mapA.ContainsKey($size)) {
        $mapA[$size] = New-Object System.Collections.ArrayList
    }
    # We will lazily compute SHA1 for A only when needed by a matching size from B.
    # To keep things simple and deterministic, pre-hash A (hundreds of files is fine).
    try {
        $sha1 = Get-FileSHA1 -Path $f.FullName
    } catch {
        Write-Warn $_.Exception.Message
        continue
    }
    [void]$mapA[$size].Add(@{ Path = $f.FullName; SHA1 = $sha1 })
}

Write-Info "Scanning DirB..."
$filesB = Get-FilesByExtensions -Root $DirB -Extensions $EXTENSIONS
Write-Info ("DirB files: {0}" -f $filesB.Count)

Write-Info "Matching duplicates (DirB vs DirA by Size+SHA1)..."
$dups = New-Object System.Collections.Generic.List[object]
$j = 0
foreach ($f in $filesB) {
    $j++
    if ($j % 300 -eq 0) { Write-Host ("  ...{0}/{1}" -f $j, $filesB.Count) }
    $size = $f.Length
    if (-not $mapA.ContainsKey($size)) { continue }  # quick pre-filter by size

    # Compute hash for B candidate
    $bHash = $null
    try {
        $bHash = Get-FileSHA1 -Path $f.FullName
    } catch {
        Write-Warn $_.Exception.Message
        continue
    }

    # Compare with all A entries of the same size
    $aList = $mapA[$size]
    foreach ($a in $aList) {
        if ($a.SHA1 -eq $bHash) {
            $dups.Add([PSCustomObject]@{
                SizeBytes = $size
                SHA1      = $bHash
                InA       = $a.Path
                InB       = $f.FullName
            }) | Out-Null
        }
    }
}

Write-Info ("Exact duplicates found: {0}" -f $dups.Count)

# Preview (unique by InB), limit to PREVIEW_MAX
if ($dups.Count -gt 0) {
    $uniq = $dups | Group-Object InB | ForEach-Object { $_.Group[0] }
    Write-Host ""
    Write-Host "=== PREVIEW (first $PREVIEW_MAX, unique by InB) ==="
    $uniq | Select-Object SizeBytes, InA, InB -First $PREVIEW_MAX | Format-Table -AutoSize
    if ($uniq.Count -gt $PREVIEW_MAX) {
        Write-Warn ("...and {0} more not shown" -f ($uniq.Count - $PREVIEW_MAX))
    }
    Write-Host "==============================================="
} else {
    Write-Warn "No exact (byte-identical) duplicates detected by Size+SHA1."
}

if (-not $LIVE) {
    Write-Warn "DRY RUN complete. No deletions performed. Set `$LIVE = `$true to remove duplicates in DirB (to Recycle Bin)."
    return
}

# LIVE deletion (unique by InB)
Write-Warn "LIVE MODE: sending duplicates from DirB to Recycle Bin..."
$targets = $dups | Group-Object InB | ForEach-Object { $_.Name }
$deleted = 0; $failed = 0
$k = 0
foreach ($pathB in $targets) {
    $k++
    if ($k % 100 -eq 0) { Write-Host ("  deleting... {0}/{1}" -f $k, $targets.Count) }
    if (Test-Path -LiteralPath $pathB) {
        if (Remove-ToRecycleBin -Path $pathB) {
            $deleted++
            Write-Host ("[DEL ] {0}" -f $pathB)
        } else {
            $failed++
            Write-Warn ("[FAIL] {0}" -f $pathB)
        }
    } else {
        $failed++
        Write-Warn ("[MISS] {0} (already gone?)" -f $pathB)
    }
}
Write-Info ("Deletion summary: deleted={0}, failed/missed={1}" -f $deleted, $failed)

Пример использования

Dry-run
[INFO ] DirA: G:\HTC\1
[INFO ] DirB: G:\HTC\2
[INFO ] Mode: DRY (no deletion)
[INFO ] Match method: Exact Size + SHA1
[INFO ] Scanning DirA...
[INFO ] DirA files: 446
[INFO ] Indexing DirA by Size...
  ...300/446
[INFO ] Scanning DirB...
[INFO ] DirB files: 373
[INFO ] Matching duplicates (DirB vs DirA by Size+SHA1)...
  ...300/373
[INFO ] Exact duplicates found: 125

=== PREVIEW (first 100, unique by InB) ===

SizeBytes InA                   InB                       
--------- ---                   ---                       
   588221 G:\HTC\1\IMAG0018.jpg G:\HTC\2\1362058970899.jpg
   954926 G:\HTC\1\IMAG0056.jpg G:\HTC\2\1363077617069.jpg
   459279 G:\HTC\1\IMAG0057.jpg G:\HTC\2\1363077784709.jpg
   388389 G:\HTC\1\IMAG0058.jpg G:\HTC\2\1363079961517.jpg
   451872 G:\HTC\1\IMAG0086.jpg G:\HTC\2\1363320518888.jpg
  1053514 G:\HTC\1\IMAG0091.jpg G:\HTC\2\1363445381567.jpg
   729918 G:\HTC\1\IMAG0094.jpg G:\HTC\2\1363446004621.jpg
   804966 G:\HTC\1\IMAG0106.jpg G:\HTC\2\1363595407867.jpg
   943645 G:\HTC\1\IMAG0137.jpg G:\HTC\2\1364620576203.jpg
  1138647 G:\HTC\1\IMAG0138.jpg G:\HTC\2\1364733349818.jpg
   394164 G:\HTC\1\IMAG0139.jpg G:\HTC\2\1364753650346.jpg
  1442850 G:\HTC\1\IMAG0141.jpg G:\HTC\2\1364825323600.jpg
  1027479 G:\HTC\1\IMAG0142.jpg G:\HTC\2\1364825392036.jpg
   393121 G:\HTC\1\IMAG0143.jpg G:\HTC\2\1364834957542.jpg
   462768 G:\HTC\1\IMAG0144.jpg G:\HTC\2\1364835966827.jpg
   486816 G:\HTC\1\IMAG0145.jpg G:\HTC\2\1364836127246.jpg
   563612 G:\HTC\1\IMAG0146.jpg G:\HTC\2\1364836690469.jpg
    80286 G:\HTC\1\IMAG0147.jpg G:\HTC\2\1364836867918.jpg
   641127 G:\HTC\1\IMAG0148.jpg G:\HTC\2\1364881850960.jpg
  1124759 G:\HTC\1\IMAG0149.jpg G:\HTC\2\1364881944002.jpg
   696786 G:\HTC\1\IMAG0150.jpg G:\HTC\2\1364883087762.jpg
   722554 G:\HTC\1\IMAG0151.jpg G:\HTC\2\1364894501067.jpg
  1054041 G:\HTC\1\IMAG0152.jpg G:\HTC\2\1364966704187.jpg
   665467 G:\HTC\1\IMAG0153.jpg G:\HTC\2\1364973531243.jpg
   703397 G:\HTC\1\IMAG0154.jpg G:\HTC\2\1364979118276.jpg
   698491 G:\HTC\1\IMAG0155.jpg G:\HTC\2\1364979813742.jpg
   702312 G:\HTC\1\IMAG0159.jpg G:\HTC\2\1365063153491.jpg
   633756 G:\HTC\1\IMAG0178.jpg G:\HTC\2\1365413366493.jpg
   703424 G:\HTC\1\IMAG0179.jpg G:\HTC\2\1365489368986.jpg
  1445396 G:\HTC\1\IMAG0180.jpg G:\HTC\2\1365575622452.jpg
   333699 G:\HTC\1\IMAG0181.jpg G:\HTC\2\1365876802562.jpg
   441843 G:\HTC\1\IMAG0182.jpg G:\HTC\2\1365908505060.jpg
   660246 G:\HTC\1\IMAG0184.jpg G:\HTC\2\1365932973712.jpg
   429681 G:\HTC\1\IMAG0186.jpg G:\HTC\2\1366170898366.jpg
   950685 G:\HTC\1\IMAG0187.jpg G:\HTC\2\1366209022342.jpg
   587641 G:\HTC\1\IMAG0188.jpg G:\HTC\2\1366259951448.jpg
  1281015 G:\HTC\1\IMAG0195.jpg G:\HTC\2\1366282360440.jpg
  1051292 G:\HTC\1\IMAG0196.jpg G:\HTC\2\1366302851367.jpg
  1953143 G:\HTC\1\IMAG0197.jpg G:\HTC\2\1366355864408.jpg
  2768321 G:\HTC\1\IMAG0198.jpg G:\HTC\2\1366369298519.jpg
  1008320 G:\HTC\1\IMAG0205.jpg G:\HTC\2\1366793810404.jpg
   311023 G:\HTC\1\IMAG0213.jpg G:\HTC\2\1366996578507.jpg
  1023622 G:\HTC\1\IMAG0214.jpg G:\HTC\2\1366996695563.jpg
  1277407 G:\HTC\1\IMAG0216.jpg G:\HTC\2\1367057094395.jpg
  1341053 G:\HTC\1\IMAG0217.jpg G:\HTC\2\1367068499201.jpg
  2115093 G:\HTC\1\IMAG0219.jpg G:\HTC\2\1367095011539.jpg
  2204012 G:\HTC\1\IMAG0220.jpg G:\HTC\2\1367139206221.jpg
  1515483 G:\HTC\1\IMAG0221.jpg G:\HTC\2\1367139878469.jpg
  2304019 G:\HTC\1\IMAG0222.jpg G:\HTC\2\1367175126252.jpg
  1425321 G:\HTC\1\IMAG0223.jpg G:\HTC\2\1367176573043.jpg
   880847 G:\HTC\1\IMAG0224.jpg G:\HTC\2\1367210974465.jpg
  2474958 G:\HTC\1\IMAG0225.jpg G:\HTC\2\1367211327847.jpg
  2116503 G:\HTC\1\IMAG0226.jpg G:\HTC\2\1367211363180.jpg
  2435585 G:\HTC\1\IMAG0227.jpg G:\HTC\2\1367222901220.jpg
  1840658 G:\HTC\1\IMAG0229.jpg G:\HTC\2\1367244780099.jpg
   962832 G:\HTC\1\IMAG0230.jpg G:\HTC\2\1367306522656.jpg
  1066486 G:\HTC\1\IMAG0231.jpg G:\HTC\2\1367307647258.jpg
  2381119 G:\HTC\1\IMAG0232.jpg G:\HTC\2\1367315399665.jpg
  1471177 G:\HTC\1\IMAG0233.jpg G:\HTC\2\1367321589164.jpg
  3192215 G:\HTC\1\IMAG0234.jpg G:\HTC\2\1367321696263.jpg
  1456028 G:\HTC\1\IMAG0235.jpg G:\HTC\2\1367321819213.jpg
   923638 G:\HTC\1\IMAG0236.jpg G:\HTC\2\1367333555999.jpg
  1801088 G:\HTC\1\IMAG0243.jpg G:\HTC\2\1367523644214.jpg
  2087287 G:\HTC\1\IMAG0244.jpg G:\HTC\2\1367566636837.jpg
  1493749 G:\HTC\1\IMAG0245.jpg G:\HTC\2\1367566879688.jpg
  1484383 G:\HTC\1\IMAG0247.jpg G:\HTC\2\1367660813069.jpg
  2468054 G:\HTC\1\IMAG0248.jpg G:\HTC\2\1367693392258.jpg
   945267 G:\HTC\1\IMAG0251.jpg G:\HTC\2\1367823835624.jpg
  1265107 G:\HTC\1\IMAG0253.jpg G:\HTC\2\1367998235665.jpg
  1645488 G:\HTC\1\IMAG0254.jpg G:\HTC\2\1368004429272.jpg
  3420740 G:\HTC\1\IMAG0255.jpg G:\HTC\2\1368006428636.jpg
   713348 G:\HTC\1\IMAG0311.jpg G:\HTC\2\1368354536405.jpg
  1274572 G:\HTC\1\IMAG0312.jpg G:\HTC\2\1368360536693.jpg
  1663341 G:\HTC\1\IMAG0313.jpg G:\HTC\2\1368445151888.jpg
  2048378 G:\HTC\1\IMAG0326.jpg G:\HTC\2\1368694138061.jpg
  1886635 G:\HTC\1\IMAG0331.jpg G:\HTC\2\1368812538578.jpg
  2452256 G:\HTC\1\IMAG0332.jpg G:\HTC\2\1368812591474.jpg
  2211613 G:\HTC\1\IMAG0333.jpg G:\HTC\2\1368812667889.jpg
  2020178 G:\HTC\1\IMAG0334.jpg G:\HTC\2\1368856275248.jpg
  1057429 G:\HTC\1\IMAG0335.jpg G:\HTC\2\1368860202167.jpg
  1131721 G:\HTC\1\IMAG0336.jpg G:\HTC\2\1368860272056.jpg
  1606498 G:\HTC\1\IMAG0337.jpg G:\HTC\2\1368870800034.jpg
  2132503 G:\HTC\1\IMAG0344.jpg G:\HTC\2\1368875390790.jpg
  1287163 G:\HTC\1\IMAG0360.jpg G:\HTC\2\1369035538156.jpg
  1031164 G:\HTC\1\IMAG0366.jpg G:\HTC\2\1369119430895.jpg
  3052461 G:\HTC\1\IMAG0372.jpg G:\HTC\2\1369126335095.jpg
  3048389 G:\HTC\1\IMAG0373.jpg G:\HTC\2\1369147777797.jpg
  1622929 G:\HTC\1\IMAG0374.jpg G:\HTC\2\1369199159966.jpg
   599631 G:\HTC\1\IMAG0376.jpg G:\HTC\2\1369379521015.jpg
   424870 G:\HTC\1\IMAG0378.jpg G:\HTC\2\1369388359264.jpg
   536877 G:\HTC\1\IMAG0379.jpg G:\HTC\2\1369388546865.jpg
   870369 G:\HTC\1\IMAG0380.jpg G:\HTC\2\1369388645578.jpg
  1215211 G:\HTC\1\IMAG0381.jpg G:\HTC\2\1369404705045.jpg
   816387 G:\HTC\1\IMAG0382.jpg G:\HTC\2\1369405772959.jpg
   963431 G:\HTC\1\IMAG0383.jpg G:\HTC\2\1369407782148.jpg
   927428 G:\HTC\1\IMAG0384.jpg G:\HTC\2\1369407834472.jpg
   926236 G:\HTC\1\IMAG0403.jpg G:\HTC\2\1369505024776.jpg
   476552 G:\HTC\1\IMAG0404.jpg G:\HTC\2\1369505799446.jpg
   566986 G:\HTC\1\IMAG0405.jpg G:\HTC\2\1369506031202.jpg
   751235 G:\HTC\1\IMAG0406.jpg G:\HTC\2\1369557893387.jpg


[WARN ] ...and 25 more not shown
===============================================
[WARN ] DRY RUN complete. No deletions performed. Set $LIVE = $true to remove duplicates in DirB (to Recycle Bin).
Боевой режим
[INFO ] DirA: G:\HTC\1
[INFO ] DirB: G:\HTC\2
[INFO ] Mode: LIVE (will delete duplicates from DirB -> Recycle Bin)
[INFO ] Match method: Exact Size + SHA1
[INFO ] Scanning DirA...
[INFO ] DirA files: 446
[INFO ] Indexing DirA by Size...
  ...300/446
[INFO ] Scanning DirB...
[INFO ] DirB files: 373
[INFO ] Matching duplicates (DirB vs DirA by Size+SHA1)...
  ...300/373
[INFO ] Exact duplicates found: 125

=== PREVIEW (first 100, unique by InB) ===

SizeBytes InA                   InB                       
--------- ---                   ---                       
   588221 G:\HTC\1\IMAG0018.jpg G:\HTC\2\1362058970899.jpg
   954926 G:\HTC\1\IMAG0056.jpg G:\HTC\2\1363077617069.jpg
   459279 G:\HTC\1\IMAG0057.jpg G:\HTC\2\1363077784709.jpg
   388389 G:\HTC\1\IMAG0058.jpg G:\HTC\2\1363079961517.jpg
   451872 G:\HTC\1\IMAG0086.jpg G:\HTC\2\1363320518888.jpg
  1053514 G:\HTC\1\IMAG0091.jpg G:\HTC\2\1363445381567.jpg
   729918 G:\HTC\1\IMAG0094.jpg G:\HTC\2\1363446004621.jpg
   804966 G:\HTC\1\IMAG0106.jpg G:\HTC\2\1363595407867.jpg
   943645 G:\HTC\1\IMAG0137.jpg G:\HTC\2\1364620576203.jpg
  1138647 G:\HTC\1\IMAG0138.jpg G:\HTC\2\1364733349818.jpg
   394164 G:\HTC\1\IMAG0139.jpg G:\HTC\2\1364753650346.jpg
  1442850 G:\HTC\1\IMAG0141.jpg G:\HTC\2\1364825323600.jpg
  1027479 G:\HTC\1\IMAG0142.jpg G:\HTC\2\1364825392036.jpg
   393121 G:\HTC\1\IMAG0143.jpg G:\HTC\2\1364834957542.jpg
   462768 G:\HTC\1\IMAG0144.jpg G:\HTC\2\1364835966827.jpg
   486816 G:\HTC\1\IMAG0145.jpg G:\HTC\2\1364836127246.jpg
   563612 G:\HTC\1\IMAG0146.jpg G:\HTC\2\1364836690469.jpg
    80286 G:\HTC\1\IMAG0147.jpg G:\HTC\2\1364836867918.jpg
   641127 G:\HTC\1\IMAG0148.jpg G:\HTC\2\1364881850960.jpg
  1124759 G:\HTC\1\IMAG0149.jpg G:\HTC\2\1364881944002.jpg
   696786 G:\HTC\1\IMAG0150.jpg G:\HTC\2\1364883087762.jpg
   722554 G:\HTC\1\IMAG0151.jpg G:\HTC\2\1364894501067.jpg
  1054041 G:\HTC\1\IMAG0152.jpg G:\HTC\2\1364966704187.jpg
   665467 G:\HTC\1\IMAG0153.jpg G:\HTC\2\1364973531243.jpg
   703397 G:\HTC\1\IMAG0154.jpg G:\HTC\2\1364979118276.jpg
   698491 G:\HTC\1\IMAG0155.jpg G:\HTC\2\1364979813742.jpg
   702312 G:\HTC\1\IMAG0159.jpg G:\HTC\2\1365063153491.jpg
   633756 G:\HTC\1\IMAG0178.jpg G:\HTC\2\1365413366493.jpg
   703424 G:\HTC\1\IMAG0179.jpg G:\HTC\2\1365489368986.jpg
  1445396 G:\HTC\1\IMAG0180.jpg G:\HTC\2\1365575622452.jpg
   333699 G:\HTC\1\IMAG0181.jpg G:\HTC\2\1365876802562.jpg
   441843 G:\HTC\1\IMAG0182.jpg G:\HTC\2\1365908505060.jpg
   660246 G:\HTC\1\IMAG0184.jpg G:\HTC\2\1365932973712.jpg
   429681 G:\HTC\1\IMAG0186.jpg G:\HTC\2\1366170898366.jpg
   950685 G:\HTC\1\IMAG0187.jpg G:\HTC\2\1366209022342.jpg
   587641 G:\HTC\1\IMAG0188.jpg G:\HTC\2\1366259951448.jpg
  1281015 G:\HTC\1\IMAG0195.jpg G:\HTC\2\1366282360440.jpg
  1051292 G:\HTC\1\IMAG0196.jpg G:\HTC\2\1366302851367.jpg
  1953143 G:\HTC\1\IMAG0197.jpg G:\HTC\2\1366355864408.jpg
  2768321 G:\HTC\1\IMAG0198.jpg G:\HTC\2\1366369298519.jpg
  1008320 G:\HTC\1\IMAG0205.jpg G:\HTC\2\1366793810404.jpg
   311023 G:\HTC\1\IMAG0213.jpg G:\HTC\2\1366996578507.jpg
  1023622 G:\HTC\1\IMAG0214.jpg G:\HTC\2\1366996695563.jpg
  1277407 G:\HTC\1\IMAG0216.jpg G:\HTC\2\1367057094395.jpg
  1341053 G:\HTC\1\IMAG0217.jpg G:\HTC\2\1367068499201.jpg
  2115093 G:\HTC\1\IMAG0219.jpg G:\HTC\2\1367095011539.jpg
  2204012 G:\HTC\1\IMAG0220.jpg G:\HTC\2\1367139206221.jpg
  1515483 G:\HTC\1\IMAG0221.jpg G:\HTC\2\1367139878469.jpg
  2304019 G:\HTC\1\IMAG0222.jpg G:\HTC\2\1367175126252.jpg
  1425321 G:\HTC\1\IMAG0223.jpg G:\HTC\2\1367176573043.jpg
   880847 G:\HTC\1\IMAG0224.jpg G:\HTC\2\1367210974465.jpg
  2474958 G:\HTC\1\IMAG0225.jpg G:\HTC\2\1367211327847.jpg
  2116503 G:\HTC\1\IMAG0226.jpg G:\HTC\2\1367211363180.jpg
  2435585 G:\HTC\1\IMAG0227.jpg G:\HTC\2\1367222901220.jpg
  1840658 G:\HTC\1\IMAG0229.jpg G:\HTC\2\1367244780099.jpg
   962832 G:\HTC\1\IMAG0230.jpg G:\HTC\2\1367306522656.jpg
  1066486 G:\HTC\1\IMAG0231.jpg G:\HTC\2\1367307647258.jpg
  2381119 G:\HTC\1\IMAG0232.jpg G:\HTC\2\1367315399665.jpg
  1471177 G:\HTC\1\IMAG0233.jpg G:\HTC\2\1367321589164.jpg
  3192215 G:\HTC\1\IMAG0234.jpg G:\HTC\2\1367321696263.jpg
  1456028 G:\HTC\1\IMAG0235.jpg G:\HTC\2\1367321819213.jpg
   923638 G:\HTC\1\IMAG0236.jpg G:\HTC\2\1367333555999.jpg
  1801088 G:\HTC\1\IMAG0243.jpg G:\HTC\2\1367523644214.jpg
  2087287 G:\HTC\1\IMAG0244.jpg G:\HTC\2\1367566636837.jpg
  1493749 G:\HTC\1\IMAG0245.jpg G:\HTC\2\1367566879688.jpg
  1484383 G:\HTC\1\IMAG0247.jpg G:\HTC\2\1367660813069.jpg
  2468054 G:\HTC\1\IMAG0248.jpg G:\HTC\2\1367693392258.jpg
   945267 G:\HTC\1\IMAG0251.jpg G:\HTC\2\1367823835624.jpg
  1265107 G:\HTC\1\IMAG0253.jpg G:\HTC\2\1367998235665.jpg
  1645488 G:\HTC\1\IMAG0254.jpg G:\HTC\2\1368004429272.jpg
  3420740 G:\HTC\1\IMAG0255.jpg G:\HTC\2\1368006428636.jpg
   713348 G:\HTC\1\IMAG0311.jpg G:\HTC\2\1368354536405.jpg
  1274572 G:\HTC\1\IMAG0312.jpg G:\HTC\2\1368360536693.jpg
  1663341 G:\HTC\1\IMAG0313.jpg G:\HTC\2\1368445151888.jpg
  2048378 G:\HTC\1\IMAG0326.jpg G:\HTC\2\1368694138061.jpg
  1886635 G:\HTC\1\IMAG0331.jpg G:\HTC\2\1368812538578.jpg
  2452256 G:\HTC\1\IMAG0332.jpg G:\HTC\2\1368812591474.jpg
  2211613 G:\HTC\1\IMAG0333.jpg G:\HTC\2\1368812667889.jpg
  2020178 G:\HTC\1\IMAG0334.jpg G:\HTC\2\1368856275248.jpg
  1057429 G:\HTC\1\IMAG0335.jpg G:\HTC\2\1368860202167.jpg
  1131721 G:\HTC\1\IMAG0336.jpg G:\HTC\2\1368860272056.jpg
  1606498 G:\HTC\1\IMAG0337.jpg G:\HTC\2\1368870800034.jpg
  2132503 G:\HTC\1\IMAG0344.jpg G:\HTC\2\1368875390790.jpg
  1287163 G:\HTC\1\IMAG0360.jpg G:\HTC\2\1369035538156.jpg
  1031164 G:\HTC\1\IMAG0366.jpg G:\HTC\2\1369119430895.jpg
  3052461 G:\HTC\1\IMAG0372.jpg G:\HTC\2\1369126335095.jpg
  3048389 G:\HTC\1\IMAG0373.jpg G:\HTC\2\1369147777797.jpg
  1622929 G:\HTC\1\IMAG0374.jpg G:\HTC\2\1369199159966.jpg
   599631 G:\HTC\1\IMAG0376.jpg G:\HTC\2\1369379521015.jpg
   424870 G:\HTC\1\IMAG0378.jpg G:\HTC\2\1369388359264.jpg
   536877 G:\HTC\1\IMAG0379.jpg G:\HTC\2\1369388546865.jpg
   870369 G:\HTC\1\IMAG0380.jpg G:\HTC\2\1369388645578.jpg
  1215211 G:\HTC\1\IMAG0381.jpg G:\HTC\2\1369404705045.jpg
   816387 G:\HTC\1\IMAG0382.jpg G:\HTC\2\1369405772959.jpg
   963431 G:\HTC\1\IMAG0383.jpg G:\HTC\2\1369407782148.jpg
   927428 G:\HTC\1\IMAG0384.jpg G:\HTC\2\1369407834472.jpg
   926236 G:\HTC\1\IMAG0403.jpg G:\HTC\2\1369505024776.jpg
   476552 G:\HTC\1\IMAG0404.jpg G:\HTC\2\1369505799446.jpg
   566986 G:\HTC\1\IMAG0405.jpg G:\HTC\2\1369506031202.jpg
   751235 G:\HTC\1\IMAG0406.jpg G:\HTC\2\1369557893387.jpg


[WARN ] ...and 25 more not shown
===============================================
[WARN ] LIVE MODE: sending duplicates from DirB to Recycle Bin...
[DEL ] G:\HTC\2\1362058970899.jpg
[DEL ] G:\HTC\2\1363077617069.jpg
[DEL ] G:\HTC\2\1363077784709.jpg
[DEL ] G:\HTC\2\1363079961517.jpg
[DEL ] G:\HTC\2\1363320518888.jpg
[DEL ] G:\HTC\2\1363445381567.jpg
[DEL ] G:\HTC\2\1363446004621.jpg
[DEL ] G:\HTC\2\1363595407867.jpg
[DEL ] G:\HTC\2\1364620576203.jpg
[DEL ] G:\HTC\2\1364733349818.jpg
[DEL ] G:\HTC\2\1364753650346.jpg
[DEL ] G:\HTC\2\1364825323600.jpg
[DEL ] G:\HTC\2\1364825392036.jpg
[DEL ] G:\HTC\2\1364834957542.jpg
[DEL ] G:\HTC\2\1364835966827.jpg
[DEL ] G:\HTC\2\1364836127246.jpg
[DEL ] G:\HTC\2\1364836690469.jpg
[DEL ] G:\HTC\2\1364836867918.jpg
[DEL ] G:\HTC\2\1364881850960.jpg
[DEL ] G:\HTC\2\1364881944002.jpg
[DEL ] G:\HTC\2\1364883087762.jpg
[DEL ] G:\HTC\2\1364894501067.jpg
[DEL ] G:\HTC\2\1364966704187.jpg
[DEL ] G:\HTC\2\1364973531243.jpg
[DEL ] G:\HTC\2\1364979118276.jpg
[DEL ] G:\HTC\2\1364979813742.jpg
[DEL ] G:\HTC\2\1365063153491.jpg
[DEL ] G:\HTC\2\1365413366493.jpg
[DEL ] G:\HTC\2\1365489368986.jpg
[DEL ] G:\HTC\2\1365575622452.jpg
[DEL ] G:\HTC\2\1365876802562.jpg
[DEL ] G:\HTC\2\1365908505060.jpg
[DEL ] G:\HTC\2\1365932973712.jpg
[DEL ] G:\HTC\2\1366170898366.jpg
[DEL ] G:\HTC\2\1366209022342.jpg
[DEL ] G:\HTC\2\1366259951448.jpg
[DEL ] G:\HTC\2\1366282360440.jpg
[DEL ] G:\HTC\2\1366302851367.jpg
[DEL ] G:\HTC\2\1366355864408.jpg
[DEL ] G:\HTC\2\1366369298519.jpg
[DEL ] G:\HTC\2\1366793810404.jpg
[DEL ] G:\HTC\2\1366996578507.jpg
[DEL ] G:\HTC\2\1366996695563.jpg
[DEL ] G:\HTC\2\1367057094395.jpg
[DEL ] G:\HTC\2\1367068499201.jpg
[DEL ] G:\HTC\2\1367095011539.jpg
[DEL ] G:\HTC\2\1367139206221.jpg
[DEL ] G:\HTC\2\1367139878469.jpg
[DEL ] G:\HTC\2\1367175126252.jpg
[DEL ] G:\HTC\2\1367176573043.jpg
[DEL ] G:\HTC\2\1367210974465.jpg
[DEL ] G:\HTC\2\1367211327847.jpg
[DEL ] G:\HTC\2\1367211363180.jpg
[DEL ] G:\HTC\2\1367222901220.jpg
[DEL ] G:\HTC\2\1367244780099.jpg
[DEL ] G:\HTC\2\1367306522656.jpg
[DEL ] G:\HTC\2\1367307647258.jpg
[DEL ] G:\HTC\2\1367315399665.jpg
[DEL ] G:\HTC\2\1367321589164.jpg
[DEL ] G:\HTC\2\1367321696263.jpg
[DEL ] G:\HTC\2\1367321819213.jpg
[DEL ] G:\HTC\2\1367333555999.jpg
[DEL ] G:\HTC\2\1367523644214.jpg
[DEL ] G:\HTC\2\1367566636837.jpg
[DEL ] G:\HTC\2\1367566879688.jpg
[DEL ] G:\HTC\2\1367660813069.jpg
[DEL ] G:\HTC\2\1367693392258.jpg
[DEL ] G:\HTC\2\1367823835624.jpg
[DEL ] G:\HTC\2\1367998235665.jpg
[DEL ] G:\HTC\2\1368004429272.jpg
[DEL ] G:\HTC\2\1368006428636.jpg
[DEL ] G:\HTC\2\1368354536405.jpg
[DEL ] G:\HTC\2\1368360536693.jpg
[DEL ] G:\HTC\2\1368445151888.jpg
[DEL ] G:\HTC\2\1368694138061.jpg
[DEL ] G:\HTC\2\1368812538578.jpg
[DEL ] G:\HTC\2\1368812591474.jpg
[DEL ] G:\HTC\2\1368812667889.jpg
[DEL ] G:\HTC\2\1368856275248.jpg
[DEL ] G:\HTC\2\1368860202167.jpg
[DEL ] G:\HTC\2\1368860272056.jpg
[DEL ] G:\HTC\2\1368870800034.jpg
[DEL ] G:\HTC\2\1368875390790.jpg
[DEL ] G:\HTC\2\1369035538156.jpg
[DEL ] G:\HTC\2\1369119430895.jpg
[DEL ] G:\HTC\2\1369126335095.jpg
[DEL ] G:\HTC\2\1369147777797.jpg
[DEL ] G:\HTC\2\1369199159966.jpg
[DEL ] G:\HTC\2\1369379521015.jpg
[DEL ] G:\HTC\2\1369388359264.jpg
[DEL ] G:\HTC\2\1369388546865.jpg
[DEL ] G:\HTC\2\1369388645578.jpg
[DEL ] G:\HTC\2\1369404705045.jpg
[DEL ] G:\HTC\2\1369405772959.jpg
[DEL ] G:\HTC\2\1369407782148.jpg
[DEL ] G:\HTC\2\1369407834472.jpg
[DEL ] G:\HTC\2\1369505024776.jpg
[DEL ] G:\HTC\2\1369505799446.jpg
[DEL ] G:\HTC\2\1369506031202.jpg
  deleting... 100/125
[DEL ] G:\HTC\2\1369557893387.jpg
[DEL ] G:\HTC\2\1369674668659.jpg
[DEL ] G:\HTC\2\1369674764271.jpg
[DEL ] G:\HTC\2\1369674916438.jpg
[DEL ] G:\HTC\2\1369675192109.jpg
[DEL ] G:\HTC\2\1369676639408.jpg
[DEL ] G:\HTC\2\1369679559597.jpg
[DEL ] G:\HTC\2\1369680612760.jpg
[DEL ] G:\HTC\2\1369682460332.jpg
[DEL ] G:\HTC\2\1369730406432.jpg
[DEL ] G:\HTC\2\1369737737312.jpg
[DEL ] G:\HTC\2\1369741144261.jpg
[DEL ] G:\HTC\2\1369741948857.jpg
[DEL ] G:\HTC\2\1369744450595.jpg
[DEL ] G:\HTC\2\1369749337645.jpg
[DEL ] G:\HTC\2\1370014209610.jpg
[DEL ] G:\HTC\2\1370014452368.jpg
[DEL ] G:\HTC\2\1370015312746.jpg
[DEL ] G:\HTC\2\1370029358532.jpg
[DEL ] G:\HTC\2\1370203372419.jpg
[DEL ] G:\HTC\2\1370206491652.jpg
[DEL ] G:\HTC\2\1370230729212.jpg
[DEL ] G:\HTC\2\1370368255370.jpg
[DEL ] G:\HTC\2\1370368574839.jpg
[DEL ] G:\HTC\2\1370466477971.jpg
[DEL ] G:\HTC\2\1370609273329.jpg
[INFO ] Deletion summary: deleted=125, failed/missed=0

Итог

Теперь у вас есть удобный способ чистить фотоархивы от дублей без лишнего софта.
Просто настройте каталоги, запустите в ISE, проверьте результат в dry run, а затем включите live-режим для удаления.

  • No labels
Write a comment…