У меня был серьезный сбой жесткого диска, и я восстановил файлы, но они распределены по 500 DIR в совершенно случайном порядке без дат

Мне нужно переместить 10000 jpgs из 500 DIR в один DIR, чтобы я мог вручную просматривать и сортировать каждый файл. В идеале мне нужно игнорировать дубликаты (но не терять их, если они фактически являются разными файлами).

Windows 8 вылетает, когда я пытаюсь сделать это через поиск на рабочем столе.

Какие команды DOS я должен использовать для этого?

3 ответа3

1

Как и в моем другом ответе, этот скрипт PowerShell соберет все файлы в одну папку с приращением количества (x) для одинаковых имен.

$BaseDir = 'Q:\Test\2016\'
$Dest    = 'Q:\Test\jpg\'
$Ext     = '.jpg'
$RegEx   = "^(?<Name>.*?) \((?<Cnt>\d+)\)(?<Ext>$([regex]::escape($Ext)))$"

Set-Location $BaseDir

Get-ChildItem -Filter "*$Ext" -File -Recurse | ForEach-Object {
    $NewName = "$Dest$($_.Name)"
    while (Test-Path $NewName){
        If ($NewName -match $RegEx){
            $Cnt = [int]$matches.Cnt +1
            $NewName = "$($matches.Name) ($Cnt)$Ext"
        } Else {
            $NewName = "$Dest$($_.BaseName) (1)$Ext"
        }
    }
    $_|Move-Item -Destination $NewName
}
0

Я бы установил Все поиск - https://www.voidtools.com/. Это должно начать вас.

0

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

Для копирования / перемещения в одну плоскую папку эта партия может вам помочь.
Отредактируйте vars BaseDir и Dest в соответствии с вашей средой.
Файлы проверяются с помощью fc.exe, если они являются реальными дубликатами, и в этом случае они не перемещаются.
Если отличается от проводника, например число в скобках (1) .
Для того, чтобы этот акт имел другое расширение, var Ext может быть соответствующим образом адаптирован.

@Echo off&SetLocal EnableExtensions EnableDelayedExpansion
Set "BaseDir=Q:\Test\2016\"
Set "Dest=Q:\Test\jpg\"
Set "Ext=.jpg"

Pushd "%BaseDir%"
For /f "delims=" %%A in ('Dir /B /S /A-D *%Ext% 2>Nul' 
) Do If Not Exist "%Dest%%%~nxA" (
  Move "%%~fA" "%Dest%" >Nul
) Else (
  Set Cnt=1
  Call :MoveInc "%%A" "%Dest%%%~nxA"
)
PopD
Goto :EOF

:MoveInc
:: Check if file is a duplicate
Fc.exe /B %1 %2 >Nul 2>&1 && (Echo %1 is a duplicate of %2 &Goto :Eof)
:: Check if name already has (x) appended
Set BaseName=%~n1
Echo %BaseName%|Findstr "([0-9][0-9]*)$" 1>NUL 2>&1 || Goto :Next
:: Get already present number, since " (1)" is at least 4 chars
Set Last=-4

:Again
Echo:!BaseName:~%Last%!|Find " (">NUL||(Set /A Last-=1&Goto :Again) 
Set "BaseName=!BaseName:~0,%Last%!"
Set /A Cnt=!BaseName:~%Last%! +1

:Next
Set "NewName=%Dest%%BaseName% (%Cnt%)%~x1"
If Exist "%NewName%" (Set /A Cnt+=1 & Goto :Next)
Move %1 "%NewName%" >Nul
Goto :Eof

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