Соберите похожие файлы в отдельные папки на основе ключевых слов в именах файлов из нескольких частей архивов. - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть папка, которая содержит много rar или zip файлов.Я хочу поместить похожие файлы (на основе part word в filename , если Существуют ) в собственную 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 - это цифра), если это архивы с несколькими разделениями.

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Еще один способ сделать это будет так:

$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
}
0 голосов
/ 17 декабря 2018

Если все файлы находятся в одной корневой папке и имеют заданное вами соглашение об именах, то вот один из способов переместить их в соответствующие подпапки:

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-Item и Move-Item, если хотите, чтобы они находились где-то еще, а не в качестве подпапок корневого каталога.

...