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

时间:2018-12-17 12:46:50

标签: windows powershell batch-file batch-rename

我有一个包含许多rar或zip文件的文件夹。我想将相似的文件(如果存在存在则基于文件名中的 part 词)放置到自己的文件夹中。默认情况下,父文件夹中没有任何文件文件夹。将来可能会将文件的另一部分添加到父目录中,因此这一次它应该移动文件到他自己的文件夹中,而不是创建新文件夹。

例如,假设文件为:

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是数字)。 / p>

2 个答案:

答案 0 :(得分:2)

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

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的路径放置在其他位置而不是作为根目录的子文件夹,则可以修改它们。

答案 1 :(得分:1)

另一种方法是:

$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
}