Войти

Показать полную графическую версию : [решено] Переименование файлов массово


Alexander_88
08-11-2024, 07:25
Здравствуйте, решение нужно на bat или powershell.
Есть каталог (в скрипте я должен буду указать до него путь), В этом каталоге есть другие папки … и в этих других папках есть различные файлы … необходимо переименовать эти файлы (папки переименовывать не нужно, только файлы).... Нужно переименовать по такому шаблону
zzномер
Где номер, это пятизначный номер, он будет идти по порядку, начиная с 00001
например файлы в папке:
jadshfjshdfjsd.avi
jbf.mp4
zdsjfkjdsfsd.mp4

После применения скрипта должно получиться так:
zz00001.avi
zz00002.mp4
zz00003.mp4

:)

DJ Mogarych
08-11-2024, 10:10
Нумерация сквозная или в каждой папке начинается заново?

Alexander_88
08-11-2024, 10:31
DJ Mogarych, а это без разницы :)

DJ Mogarych
08-11-2024, 11:50
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
DJ Mogarych, спасибо, выбрал второй вариант.. боялся, что возможно будет конфликт с переименованием, из-за того, что такое имя уже имеется (потому что скрипт запускается не один раз.. файлы добавляются новые, но присутствуют и старые, на которых скрипт уже отработал.. т.е. при запуске скрипта могут содержаться файлы с именами zz00001 (и подобными)), но никаких конфликтов нет, все переименовывается успешно :)

Alexander_88
28-11-2024, 06:35
Здравствуйте, Подскажите А в чём может быть проблема?, скрипт выполняется бесконечно. Я его останавливаю. Потом прохожусь по папкам, и вижу, что в какой-то из папок нумерация слишком большая, (например 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
$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
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
Я изначально не предусматривал ситуацию с постоянным повторным переименованием одних и тех же файлов в каталоге.
Ну вот, можно попробовать:

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

# Каталог
$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
Всем спасибо за помощь.
DJ Mogarych, проблема исчезла, Сейчас все файлы переименовываются :up




© OSzone.net 2001-2012