Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Переименование файлов массово

Ответить
Настройки темы
Любой язык - [решено] Переименование файлов массово

Ветеран


Сообщения: 546
Благодарности: 4

Профиль | Отправить PM | Цитировать


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

Отправлено: 07:25, 08-11-2024

 

Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6626
Благодарности: 1528

Профиль | Отправить PM | Цитировать


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

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 10:10, 08-11-2024 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Ветеран


Сообщения: 546
Благодарности: 4

Профиль | Отправить PM | Цитировать


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

Отправлено: 10:31, 08-11-2024 | #3


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6626
Благодарности: 1528

Профиль | Отправить PM | Цитировать


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, чтобы с вывода статистики переключить на реальные действия.

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

Это сообщение посчитали полезным следующие участники:

Отправлено: 11:50, 08-11-2024 | #4


Ветеран


Сообщения: 546
Благодарности: 4

Профиль | Отправить PM | Цитировать


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

Отправлено: 17:46, 08-11-2024 | #5


Ветеран


Сообщения: 546
Благодарности: 4

Профиль | Отправить PM | Цитировать


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

Отправлено: 06:35, 28-11-2024 | #6


Ветеран


Сообщения: 1758
Благодарности: 966

Профиль | Цитировать


Код: Выделить весь код
$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
}
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:30, 28-11-2024 | #7


Ветеран


Contributor


Сообщения: 2728
Благодарности: 1697

Профиль | Отправить PM | Цитировать


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

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 28-11-2024 в 18:12.

Это сообщение посчитали полезным следующие участники:

Отправлено: 13:32, 28-11-2024 | #8


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6626
Благодарности: 1528

Профиль | Отправить PM | Цитировать


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

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

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

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Последний раз редактировалось DJ Mogarych, 28-11-2024 в 17:31.

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:23, 28-11-2024 | #9


Ветеран


Сообщения: 546
Благодарности: 4

Профиль | Отправить PM | Цитировать


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

Отправлено: 15:41, 29-11-2024 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Переименование файлов массово

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Переименование файлов gremlintv2 Скриптовые языки администрирования Windows 3 27-06-2016 23:42
CMD/BAT - Переименование файлов Verilog Скриптовые языки администрирования Windows 4 10-12-2014 14:55
Переименование файлов B1010 Видео и аудио: обработка и кодирование 0 28-09-2014 11:38
переименование файлов mask Программирование и базы данных 6 20-05-2003 00:53
Переименование файлов Pavelz Microsoft Windows NT/2000/2003 7 24-01-2003 10:32




 
Переход