Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Переименование файлов массово (http://forum.oszone.net/showthread.php?t=355851)

Alexander_88 08-11-2024 07:25 3032533

Переименование файлов массово
 
Здравствуйте, решение нужно на bat или powershell.
Есть каталог (в скрипте я должен буду указать до него путь), В этом каталоге есть другие папки … и в этих других папках есть различные файлы … необходимо переименовать эти файлы (папки переименовывать не нужно, только файлы).... Нужно переименовать по такому шаблону
Код:

zzномер
Где номер, это пятизначный номер, он будет идти по порядку, начиная с 00001
например файлы в папке:
Код:

jadshfjshdfjsd.avi
jbf.mp4
zdsjfkjdsfsd.mp4

После применения скрипта должно получиться так:
Код:

zz00001.avi
zz00002.mp4
zz00003.mp4

:)

DJ Mogarych 08-11-2024 10:10 3032540

Нумерация сквозная или в каждой папке начинается заново?

Alexander_88 08-11-2024 10:31 3032542

DJ Mogarych, а это без разницы :)

DJ Mogarych 08-11-2024 11:50 3032545

Powershell v5 и новее

Сквозная нумерация:
Код:

$c = 1
dir c:\temp -Recurse -File |% {
    $_ |Rename-Item -NewName "zz$($c.ToString("00000"))$($_.Extension)" -WhatIf
    $c++
}

Нумерация в каждой папке начинается заново:
Код:

dir c:\temp -Recurse -Directory |% {
    $c = 1
    dir $_.FullName -File |% {
        $_ |Rename-Item -NewName "zz$($c.ToString("00000"))$($_.Extension)" -WhatIf
        $c++
    }
}

Уберите -WhatIf, чтобы с вывода статистики переключить на реальные действия.

Alexander_88 08-11-2024 17:46 3032569

DJ Mogarych, спасибо, выбрал второй вариант.. боялся, что возможно будет конфликт с переименованием, из-за того, что такое имя уже имеется (потому что скрипт запускается не один раз.. файлы добавляются новые, но присутствуют и старые, на которых скрипт уже отработал.. т.е. при запуске скрипта могут содержаться файлы с именами zz00001 (и подобными)), но никаких конфликтов нет, все переименовывается успешно :)

Alexander_88 28-11-2024 06:35 3033634

Здравствуйте, Подскажите А в чём может быть проблема?, скрипт выполняется бесконечно. Я его останавливаю. Потом прохожусь по папкам, и вижу, что в какой-то из папок нумерация слишком большая, (например zz01543, Хотя в папке всего 53 файла.. И каждую секунду нумерация в файлах повышается всё больше и больше.. видимо она зацикливается на одной папке и дальше не проходит … пользуюсь вторым вариантом, где нумерация начинается заново.

Код:

dir c:\temp -Recurse -Directory |% {
    $c = 1
    dir $_.FullName -File |% {
        $_ |Rename-Item -NewName "zz$($c.ToString("00000"))$($_.Extension)"
        $c++
    }
}

Это происходит непостоянно, например если я повторю скрипт, это папка пройдёт, но потом на каких-то следующих может застрять.. То есть папки, в которых скриптом может застрять могут попасться В случайном порядке.. Со сквозным переименованием также. По итогу конечно файлы все переименуются, если много раз запускать скрипт..
Примечание (Может это важно).. Файлы с именами zz00001 (00002 и т.д) уже есть в папке.. Может это важно … Ну я пробовал например заменить zz на yy, чтобы не было повторяющихся имён, результат тот же, на каких-то папках начинает застревать, всегда на разных, если скрипт запустить ещё раз, та папка, на которой он застрял, будет переименована Как нужно, но потом застрянет На следующей, или через несколько папок..

Foreigner 28-11-2024 13:30 3033643

Код:

$files = Get-ChildItem C:\Directory -File -Recurse
$zeroes = ($files.Count).ToString().Length
for ($i = 0; $i -lt $files.Count; $i++)
{
    $New = "{0:d$zeroes}.{1}" -f ($i + 1),$files[$i].Name
    Rename-Item $files[$i] $New
}


megaloman 28-11-2024 13:32 3033644

Alexander_88,
Код:

@Echo Off &Cls
        Set "BoxIn=Z:\Box_In"

        Pushd "%BoxIn%"||(Echo Folder "%BoxIn%" not found &Pause &Exit /B 2)
                For /R "%BoxIn%" %%d In (.) Do (
                Pushd "%%d"
                        Call Set /A n=10000000
                        For %%i In (*.*) Do (Set /A n+=1 &Call Set @@@%%n%%=Ren "%%i" "zz%%n:~-5%%%%~xi")
                        For /f "UseBackQ Tokens=1* Delims==" %%i IN (`2^>nul Set "@@@"`) Do (%%j &Set "%%i=")
                Popd
        )
        Popd
Pause
Exit /B


DJ Mogarych 28-11-2024 17:23 3033650

Я изначально не предусматривал ситуацию с постоянным повторным переименованием одних и тех же файлов в каталоге.
Ну вот, можно попробовать:

Сквозная нумерация
Код:

# Каталог
$folder = 'C:\temp\rename'
# Буквенный индекс конечных файлов
$letters = 'zz'
# Кол-во разрядов числа конечных файлов
$digits = '00000'

$pattern = "$letters\d{$($digits.ToCharArray().count)}"
$renamed,$notRenamed = (dir $folder -File -Recurse -OutVariable files).where({$_.BaseName -match "^$pattern$"}, 'Split')
$numbers = $renamed.basename -replace '\D' |% {$_ -as [int]}
$freenum = (1..($files.count)).where({$_ -notin $numbers})
$c = 0
$notRenamed |% {
    $_ |Rename-Item -NewName "$letters$($freenum[$c].ToString("$digits"))$($_.Extension)" -WhatIf
    $c++
}

Нумерация в каждой папке начинается заново
Код:

# Каталог
$folder = 'C:\temp\rename'
# Буквенный индекс конечных файлов
$letters = 'zz'
# Кол-во разрядов числа конечных файлов
$digits = '00000'

$pattern = "$letters\d{$($digits.ToCharArray().count)}"
dir $folder -Directory -Recurse |% {
    $renamed,$notRenamed = (dir $_.fullname -File -OutVariable files).where({$_.BaseName -match "^$pattern$"}, 'Split')
    $numbers = $renamed.basename -replace '\D' |% {$_ -as [int]}
    $freenum = (1..($files.count)).where({$_ -notin $numbers})
    $c = 0
    $notRenamed |% {
        $_ |Rename-Item -NewName "$letters$($freenum[$c].ToString("$digits"))$($_.Extension)" -WhatIf
        $c++
    }
}

Уберите -WhatIf, чтобы с вывода статистики переключить на реальные действия.

Переименовываются только те файлы, которые не совпадают с паттерном. Если в нумерации есть пропуски, то они будут заполняться новыми файлами.

Alexander_88 29-11-2024 15:41 3033674

Всем спасибо за помощь.
DJ Mogarych, проблема исчезла, Сейчас все файлы переименовываются :up


Время: 05:33.

Время: 05:33.
© OSzone.net 2001-