如何批量运行跨目录查找重复项的脚本,并将其替换为较小的文件?

问题描述 投票:0回答:1

我有一个已混合和匹配的脚本,但无法运行(在底部)。举个例子:我正在使用 powershell 来查找重复的文件 - 文件名。我有一个文件 - WhatzIt.mp3 - 这是我想保留的文件,因为它是该特定编码中最小的文件。我在其他目录中有该文件的较旧/较大版本 - 具有不同的扩展名 - 我想用该文件覆盖它。

示例:

  • 文件夹A - WhatzIt.mp3 5mb

  • 文件夹B - WhatzIt.m4a 10mb

  • 文件夹B - WhatzIt.opus 7mb

  • 文件夹B - WhatzIt.mp3 8mb

期望的结果:

  • 文件夹A - WhatzIt.mp3 5mb

  • 文件夹B - WhatzIt.mp3 5mb

我想要一个递归搜索,在选定的(2个或更多,FolderA + FoldB)目录及其子目录中,将识别(在本例中)有4个具有相同文件名的文件(“WhatzIt”,可能区分大小写,忽略扩展名)差异) 然后,我可以自动识别较小的文件(WhatzIt.mp3)并将其复制到发现具有相同名称的文件(WhatzIt.,4a,WhatzIt.opus)的目录中,从而可能覆盖文件(WhatzIt.mp3)。文件夹 B 中的 mp3)。并删除其他较大的同名文件(WhatzIt.m4a、WhatzIt.opus)。

这是我已经尝试过的代码 - 当我用谷歌搜索时,我几乎不知道如何或为什么。


$aDir = "C:\FolderA"
$bDir = "C:\FolderB"

$aFiles = Get-ChildItem -Path "$aDir" -Recurse
$bFiles = Get-ChildItem -Path "$bDir" -Recurse

ForEach ($file in $aFiles) {
    if(Test-Path $bFiles) | Where-Object {$_.BaseName -eq $aFiles} {
        Write-Output "$file exists in $bDir. Copying."
        Remove-Item $bDir\$file -recurse | Where-Object {$_.BaseName -eq $aFile}
        Copy-Item $aDir\$file $bDir -recurse -include *.opus, *.mp3,*.m4a
        
    } else {
        Write-Output "$file does not exist in $bDir."
    }
}

脚本输出(或执行)了写入输出部分,但似乎没有处理或考虑代码的其余部分。我认为它设法在目录之间进行比较 - 也许不会 - 但然后什么也不做。

windows powershell file duplicates
1个回答
0
投票

您似乎在告诉我们您总是希望复制FolderA中的文件 到FolderB,因为它比FoldreB 中的文件更小且更新,对吗?
同时删除FolderB中具有相似BaseName但具有不同扩展名的所有文件
(“.opus”、“.mp3”、“.m4a”中的任何一个)

为此,我建议使用 Get-ChildItem 仅获取具有任何以下内容的 files 首先提到的三个扩展名,然后循环遍历文件夹 A 中的列表以查找并删除文件夹 B 中的文件。

# append switch -File so your lists will not also contain directories
$aFiles = Get-ChildItem -Path $aDir -File -Include '*.opus', '*.mp3','*.m4a' -Recurse
$bFiles = Get-ChildItem -Path $bDir -File -Include '*.opus', '*.mp3','*.m4a' -Recurse

# loop over the source files in FolderA
foreach ($file in $aFiles) {
    # delete the B files with the same BaseName as the current file from the A folder
    $bFiles | Where-Object {$_.BaseName -eq $file.BaseName} | ForEach-Object {
        Write-Host "Deleting '$($_.FullName)'..."
        $_ | Remove-Item -WhatIf   # see below about the WhatIf switch
    }
    # next, copy the file from the A folder to the B folder
    $file | Copy-Item -Destination $bDir
}

我已将

-WhatIf
添加到破坏性的
Remove-Item
命令中,因此现在发生的情况是您只能在控制台中看到哪些文件将被删除。 事实上,没有任何东西被真正删除。如果控制台中的输出符合您的预期,请删除
-WhatIf
开关并再次运行代码

© www.soinside.com 2019 - 2024. All rights reserved.