用于比较两个不同文件夹内容的脚本,并根据最小相似度重命名

时间:2017-05-13 17:33:39

标签: windows powershell batch-file vbscript batch-rename

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

这是在Windows 10上,而不是Linux。

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

示例:

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多个文件,因此希望将其作为自动作业运行。

提前致谢。

1 个答案:

答案 0 :(得分:0)

如果你想要摆脱的东西总是在括号中,那么你可以写一个正则表达式 (.*?)([\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

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