比较两个不同文件夹内容并根据最小相似性重命名它们的脚本
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
也许你可以用这个想法来构建。
故事: 我有多个文件夹,每个文件夹中有 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
也许你可以用这个想法来构建。