Обрезать имена файлов, чтобы сделать их менее 100 символов - PullRequest
1 голос
/ 16 апреля 2019

Я получил следующие файлы в нескольких каталогах:

File 1: Normal file 1.txt
File 2: Normal file 1(1).txt
File 3: Normal file 1 longer file.txt
File 4: Normal file 1 longer file even longer.txt
File 5: Normal File 1 longer file(1).txt

Я хочу обрезать файлы до ± 150 символов (можно будет установить значение позже).Для файлов, которые имеют (1), (2), (12) в конце, у меня в настоящее время есть следующее решение:

gci -File -Recurse |
    Where BaseName -match '^(.{140})..*(\(\d+\))$' |
    Rename-Item -NewName {$Matches[1] + $Matches[2] + $_.Extension} -WhatIf

Это прекрасно работает, потому что не будет, что у меня будет дубликат файлаnames.

Но если я использую следующий скрипт для файлов без (1), (2), (12), это не удастся.Потому что, если, например, я урезал файл 3 до «Обычного файла 1», я получил ошибку, что он уже существует.

Использовал для этого код:

gci -File -Recurse |
    Where BaseName -match '^(.{140})' |
    Rename-Item -NewName {$Matches[1] + $_.Extension} -WhatIf

Я думал, чтобы решить эту проблемупроблема с кодом, который я использовал для чего-то другого, но не могу заставить его работать до сих пор.Может случиться так, что файл с (1) также уже существует.

Get-ChildItem -File -Recurse |
    where BaseName -match '^(.{140})' |
    Group-Object { $_.DirectoryName + "\" + $Matches[1].TrimEnd() + $_.Extension } |
    foreach {
        $fi = [IO.FileInfo]::New($_.Name)
        $i = 0
        $_.Group | Rename-Item -NewName {
            do {
                $newName = $fi.DirectoryName + "\" + $fi.BaseName + $(if($i){"($i)"}) + $fi.Extension
                $script:i++
            } while (Test-Path $newName)
            $newName
        } -Whatif
    }

Я обнаружил, что если в моем каталоге есть следующие файлы:

Filename 1 - 45781.txt 
Filename 1(2).txt
Filename 1(3).txt
Filename 1(4).txt
Filename 1(5).txt
Filename 1(1).txt

Скрипт переименует файлы как:

Filename 1.txt 
Filename 1(5).txt
Filename 1(6).txt
Filename 1(7).txt
Filename 1(8).txt
Filename 1(9).txt
...