比较两个不同文件夹内容并根据最小相似性重命名它们的脚本

Script to compare two different folder contents and rename them based on minimum similarity

故事: 我有多个文件夹,每个文件夹中有 1000 多个文件,它们的名称彼此相似但略有不同,但它们与相同的内容相关。 例如,在一个文件夹中,我的文件名称非常简单 "Jobs to do.doc",而在另一个文件夹中的文件名称为 "Jobs to do (UK) (Europe).doc" 等

这是 Windows 10,而不是 Linux。

问题: 是否有脚本来比较每个文件夹的内容并根据最小相似性重命名它们?因此,最终结果将是删除所有行话并使每个文件夹(多个)中的每个文件彼此相同但仍保留在回顾文件夹中? *基本上将多个文件夹内容与一个文件夹内容进行比较并重命名,以便每个文件夹中的每个文件都命名相同?

示例:

D:/Folder1/Name_Of_File1.jpeg
D:/Folder2/Name_Of_File1 (Europe).jpeg
D:/Folder3/Name_of_File1_(Random).jpeg

D:/folder1/another_file.doc
D:/Folder2/another_file_(date_month_year).txt
D:/Folder3/another_file(UK).XML

我在上面的例子中使用了不同的文件扩展名,希望有人能写一个脚本来忽略文件扩展名。

我希望这是有道理的。因此,要么使用脚本删除括号中的内容并保持文件完整性,要么根据最小相似性重命名所有文件夹中的所有文件。

问题是它在每个文件夹中有 1000 多个文件,所以想 运行 它作为一个自动化作业。

提前致谢。

如果你想要删除的东西总是在括号中那么你可以写一个正则表达式 (.*?)([\s|_|]*\(.*\))

尝试这样的事情

$folder = Get-ChildItem 'C:\TestFolder'
$regex = '(.*?)([\s|_|]*\(.*\))'
foreach ($file in $folder){
    if ($file.BaseName -match $regex){
        Rename-Item -Path $file.FullName -NewName "$($matches[1])$($file.extension)" -Verbose #-WhatIf
    }
}

关于一致性,您可以 运行 使用相同的正则表达式进行预检查

#change each filename if it matches regex and store only it's new basename
$folder1 = get-childitem 'D:\T1' | foreach {if ($_.BaseName -match $regex){$matches[1]}else{$_.BaseName}} 
$folder2 = get-childitem 'D:\T2' | foreach {if ($_.BaseName -match $regex){$matches[1]}else{$_.BaseName}}
#compare basenames in two folders - if all are the same nothing will be returned 
Compare-Object $folder1 $folder2

也许你可以用这个想法来构建。