根据多部分存档文件名中的关键字将相似文件收集到单独的文件夹中

Gather similar files into separate folders based on keywords in the filenames of multi-part archives

我有一个包含许多 rar 或 zip 文件的文件夹。我想把类似的文件(基于 part word in filename if exist)拥有 folder.by 默认在父文件夹中没有任何 folder.maybe 将来文件的另一部分添加到父目录所以这次它应该 移动 文件到他自己的文件夹而不是创建新文件夹。

例如假设文件是​​:

Visual_Studio_2015.part1.rar
Visual_Studio_2015.part2.rar
Visual_Studio_2015.part3.rar

SQL-Server-Enterprise-2016-SP1.part1.rar
SQL-Server-Enterprise-2016-SP1.part2.rar

VSCodeSetup x64 1.29.1.rar

Microsoft.Visual.Studio.Ultimate.2012.update.3.part1.rar
Microsoft.Visual.Studio.Ultimate.2012.update.3.part12.rar

移动后变成这样:

Parent Directory
├───Visual_Studio_2015
│   ├───Visual_Studio_2015.part1.rar
│   ├───Visual_Studio_2015.part2.rar
│   ├───Visual_Studio_2015.part3.rar
├───VSCodeSetup x64 1.29.1
│   ├───VSCodeSetup x64 1.29.1.rar
├───SQL-Server-Enterprise-2016-SP1
│   ├───SQL-Server-Enterprise-2016-SP1.part1.rar
│   ├───SQL-Server-Enterprise-2016-SP1.part2.rar
├───Microsoft.Visual.Studio.Ultimate.2012.update.3
│   ├───Microsoft.Visual.Studio.Ultimate.2012.update.3.part1.rar
│   ├───Microsoft.Visual.Studio.Ultimate.2012.update.3.part2.rar

我无法使用任何软件或编译的编程语言来解决这个问题。抱歉英语不好

更新: 在 powershell 中是这样的:

Get-ChildItem -File | 
  Group-Object { $_.Name -replace '.part.*' } | 
  ForEach-Object {
    $dir = New-Item -Type Directory -Name $_.Name
    $_.Group | Move-Item -Destination $dir
  }

可以分隔文件名中有 part 的文件,但没有它就不能工作,我还必须提到所有文件名都以 .partX(X 是数字)结尾,如果它是多部分存档。

如果所有文件都在一个根文件夹中并且具有您指定的命名约定,那么这里是将它们移动到适当子文件夹中的一种方法:

Get-Childitem -path "C:\Test" -File |
    ForEach-Object {
        if($_.Name -match "^(?<folder>.*)\.part\d+|(?<folder>.*)\.rar$") {
            New-Item -Path "$($_.Directory)$($matches.Folder)" -ItemType Directory -Force | Out-Null

            Move-Item -Path $_.FullName -Destination "$($_.Directory)$($matches.Folder)$($_.Name)" -Force
        }
    }

适当更改Get-Childitem中的路径。此外,如果您希望 New-ItemMove-Item 位于其他位置而不是作为根目录的子文件夹,您可以修改它们的路径。

另一种方法是这样的:

$parentFolder = '<THE PARENTFOLDER THAT HOLDS ALL .RAR AND .ZIP FILES>'

# Get all files inside the parent folder with extension '.rar' or '.zip'
# Because '-Filter' only accepts a single string, we need to use a 'Where-Object' clause.
# Another way would be to use the '-Include' parameter on Get-Childitem, but for that to work
# you must either also use '-Recurse' or append '\*' to the $parentfolder like this:
#  Get-ChildItem -Path "$parentFolder\*" -File -Include *.rar, *.zip
Get-ChildItem -Path $parentFolder -File | Where-Object { $_.Extension -match '\.(rar|zip)$' } | ForEach-Object {
    # create the name of the subfolder by removing the '.partX' from the basename if that exists
    $subFolder = Join-Path -Path $parentFolder -ChildPath ($_.BaseName -replace '\.part\d+', '')
    # create this subfolder if it does not already exist
    if (!(Test-Path -Path $subFolder -PathType Container)) {
        New-Item -Path $subFolder -ItemType Directory -Force | Out-Null
    }
    # move the file to the subfolder
    $_ | Move-Item -Destination $subFolder
}