将多个目录中的文件类型移动到单个目录中

将多个目录中的文件类型移动到单个目录中

我的硬盘出现了重大故障,我恢复了文件,但它们分散在 500 个目录中,顺序完全随机,没有日期

我需要将 10,000 张 jpg 文件从 500 个 DIR 移动到一个 DIR,以便我可以手动查看和排序每个文件。理想情况下,我需要忽略重复文件(但不要丢失它们,以防它们实际上是不同的文件)。

当我尝试通过桌面搜索执行此操作时,Windows 8 出现故障。

为此我应该使用什么 DOS 命令?

答案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
}

答案2

我会安装 Everything Search -https://www.voidtools.com/. 这应该可以让你开始行动了。

答案3

我不知道您的 jpg 文件名是什么样的,但查看文件中是否有任何标签以便用日期、位置等重命名它们可能是一个更好的选择。

对于复制/移动到单个平面文件夹,此批处理可能会对您有所帮助。
编辑 varsBaseDirDest以适合您的环境。
使用 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

相关内容