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

Windows 脚本比较两个不同的文件夹内容,并根据最小相似性重命名它们,windows,powershell,batch-file,vbscript,batch-rename,Windows,Powershell,Batch File,Vbscript,Batch Rename,故事: 我有多个文件夹,每个文件夹中有1000多个文件,它们的名称彼此相似,但略有不同,但与相同的内容相关。 例如,在一个文件夹中,我有简单命名为“Jobs to do.doc”的文件,在另一个文件夹中有“Jobs to do(UK)(Europe).doc”等文件 这是在Windows 10上,而不是在Linux上 问题: 是否有一个脚本来比较每个文件夹的内容并根据最小相似性重命名它们?所以最终的结果是删除所有行话,使每个文件夹中的每个文件(多个)彼此相同,但仍保留在回顾文件夹中? *基本上,

故事: 我有多个文件夹,每个文件夹中有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|u124;]*\(.*))

试试这样的

$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

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

如果你想摆脱的东西总是放在括号里,那么你可以编写一个类似的正则表达式
(.*)([\s|u124;]*\(.*))

试试这样的

$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


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

你能告诉我们你到目前为止都做了些什么吗?定义“相似性”我想我已经让它变得比需要的更混乱了,但我已经用完了咖啡。我的意思是将一个文件夹的内容与另一个文件夹的内容进行比较并重命名,使两个文件夹的内容具有相同的名称,但保留其文件扩展名。当我说最小相似性时,我指的是上面提到的,基于另一个文件夹内容重命名一个文件夹内容,如果它80%相似,则重命名它。因此,我选择的“选择文件夹”,文件夹的所有内容都将被命名为相同的名称。我没有任何东西可以处理,因为我不知道我想要的是否可能,我也不太确定我所说的是否有意义。重命名与文件夹1s内容匹配的文件夹2和3的内容。这更清楚吗?我的大脑受伤了你应该在这两个文件夹中发布一个输入文件列表,以及基于这种输入的所需输出列表;别忘了还包括一些不会被重命名的名称。我认为这应该更容易,清楚地定义你所谓的“最小相似性”的规则。你能告诉我们你到目前为止尝试了什么吗?定义“相似性”我想我已经让它比需要的更混乱了,但我已经用完了咖啡。我的意思是将一个文件夹的内容与另一个文件夹的内容进行比较并重命名,使两个文件夹的内容具有相同的名称,但保留其文件扩展名。当我说最小相似性时,我指的是上面提到的,基于另一个文件夹内容重命名一个文件夹内容,如果它80%相似,则重命名它。因此,我选择的“选择文件夹”,文件夹的所有内容都将被命名为相同的名称。我没有任何东西可以处理,因为我不知道我想要的是否可能,我也不太确定我所说的是否有意义。重命名与文件夹1s内容匹配的文件夹2和3的内容。这更清楚吗?我的大脑受伤了你应该在这两个文件夹中发布一个输入文件列表,以及基于这种输入的所需输出列表;别忘了还包括一些不会被重命名的名称。我认为这应该更容易,清楚地定义你所说的“最小相似性”的规则。我非常欣赏一个解决方案,这总是受欢迎的。上面请求比较和重命名文件夹的唯一原因是为了一致性,这样我就知道所有文件夹内容(我指定的)除了文件扩展名外都具有相同的名称。通过删除括号中的任何内容,您的powershell脚本让我成功了一半,但我得到了以下错误:假设:在目标“Item:X:\Test\TestFile01.txt:X:\Test\TestFile01.txt”上执行“重命名文件”操作。TestFile01.txt不应给出与此正则表达式匹配的结果。古怪的此文件名没有错误。抱歉更正。我漏了一点。错误:如果:在目标“项:C:\Test\TestFile01(欧洲)上执行“重命名文件”操作。zip目标:C:\Test\TestFile01.zip”。我省略了括号中的区域,这是我希望运行此脚本的主要原因。它可以删除括号中的任何内容,包括括号。如果不想重命名文件,请删除-WhatIf。这不是一个错误。好的,这可以做到,我有麻烦,因为我的文件夹名称中有空格,但与它一起工作。你说得很对,这让我很高兴,因为我已经受够了,哈哈。因此,请将文件夹1与文件夹2、文件夹3、文件夹4和文件夹5(如果需要)进行比较,并根据文件夹1进行重命名。我非常欣赏一个解决方案,这是非常受欢迎的。上面请求比较和重命名文件夹的唯一原因是为了一致性,这样我就知道所有文件夹内容(我指定的)除了文件扩展名外都具有相同的名称。通过删除括号中的任何内容,您的powershell脚本让我成功了一半,但我得到了以下错误:假设:在目标“Item:X:\Test\TestFile01.txt:X:\Test\TestFile01.txt”上执行“重命名文件”操作。TestFile01.txt不应给出与此正则表达式匹配的结果。古怪的此文件名没有错误。抱歉更正。我漏了一点。错误:如果:在目标“项:C:\Test\TestFile01(欧洲)上执行“重命名文件”操作。zip目标:C:\Test\TestFile01.zip”。我漏掉了