Уборка Авгиевых конюшен – занятие интересное. Особенно увлекательно, если это – историческое наследие файлов, которые копились годами.
Удивительный факт – все попытки разобрать это руками давали исключительно временный эффект. Наличие множества компьютеров, многих облачных хранилищ, и тому подобного приводит к накопления множества фотографий просто с фантастической скоростью.
Чтобы хоть немного упростить и автоматизировать задачу приняли решение убрать все дубликаты из существующей библиотеки с помощью доступных механизмов Powershell. Очевидно, что в названия можно было и не попасть, то вариант с проверкой хэша выглядел довольно привлекательным.
PS> Get-ChildItem *.* -Recurse | Get-FileHash |group -Property hash | ? {$_.count -gt 1} | % {$_.group | select -skip 1}
Algorithm Hash Path
——— —- —-
SHA256 D97AB86A4A842B981998D2EE3D83CC390F40505CAF684BDFAB79B95038E1DD45 D:\animals002 – Copy (3)…
SHA256 D97AB86A4A842B981998D2EE3D83CC390F40505CAF684BDFAB79B95038E1DD45 D:\animals002 – Copy.jpg
SHA256 D97AB86A4A842B981998D2EE3D83CC390F40505CAF684BDFAB79B95038E1DD45 D:\animals002.jpg
В силу того, что в подобном варианте не очень удобно оперировать для дальнейших махинаций с данными – сильно проще все это заносить в переменную и дальше уже оперировать с этим.
PS> $dup = ls *.* -recurse | get-filehash | group -property hash | where { $_.count -gt 1 } | % { $_.
group | select -skip 1 }
PS> $dup.count
11433
В некоторых случаях может случиться довольно неприятная ситуация. Например, если в названии файла будет содержаться “[]”. В этом случае тогда придется использовать параметр -LitheralPath. Он позволит удалить, но не переименовать файл. Для переименования придется пользоваться более темной магией.
PS> Remove-Item -LiteralPath $dup.path
В некоторых случаях это может помочь.