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

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

Ответить
Настройки темы
CMD/BAT - [решено] Как дописать случайные числа к началам имён файлов в каталоге
mwz mwz вне форума

Аватара для mwz

Ушел из жизни


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

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


Знаю что задача простенькая -- но давно не занимался такого класса задачками...

Приписать случайные (достаточно трёх-пяти разрядов) числа и разделитель к началу имён всех файлов каталога (подкаталоги не интересуют), т.е. вместо, например,

...
ofigennaya_pesnya.mp3
prosto_obaldenno.mp3
...

получить типа:
...
32761_prosto_obaldenno.mp3
...
56845_ofigennaya_pesnya.mp3
...

(желательно с одинаковым числом цифр, т.е., например, не 53, а 00053 при пятиразрядных, или 053 при трёхразрядных).
Названия, приведённые для примера, подсмотрены на одном из чужих компов.

-------
Mikhail Zhilin


Отправлено: 00:03, 28-08-2014

 

Ветеран


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

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


Как-то так:
Код: Выделить весь код
@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFolder=%~1
set sTemplate=00000

if defined sSourceFolder (
	if exist "%sSourceFolder%\." (
		for /f "usebackq delims=" %%i in (
			`dir /b /a:-d "%sSourceFolder%\*.*" 2^>nul`
		) do (
			set sPredicate=%sTemplate%!random!
			ren "%sSourceFolder%\%%~i" "!sPredicate:~-5!_%%~i"
		)
	) else (
		echo Can't find source folder [%sSourceFolder%].
		exit /b 2
	)
) else (
	echo Usage: %~nx0 ^<Source folder^>
	exit /b 1
)

endlocal
exit /b 0
Целевая папка указывается аргументом пакетного файла. Также можно просто перетащить папку на пакетный файл.
Это сообщение посчитали полезным следующие участники:

Отправлено: 01:20, 28-08-2014 | #2



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

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


(*.*)


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

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


mwz, а в чем тайный смысл случайных префиксов? Ведь тогда еще и придется проверять, не оказались ли случайные неслучайными Инкрементные проще, короче и надежнее.

Код: Выделить весь код
$global:i=12345
dir c:\test\ -Filter *.mp3 | Rename-Item -NewName { "$i-$($_.Name)"; $global:i++ }

-------
Канал Windows 11, etc | Чат @winsiders


Отправлено: 01:32, 28-08-2014 | #3

mwz mwz вне форума Автор темы

Аватара для mwz

Ушел из жизни


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

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


Iska, отлично, спасибо!
Маленькая погрешность: не переименовались файлы, имена которых содержат восклицательный знак.

Vadikan, собственно, конкретную задачу можно понять из примеров: [достаточно] случайным образом пересортировать порядок следования файлов с неслучайными именами.

-------
Mikhail Zhilin


Отправлено: 01:38, 28-08-2014 | #4


(*.*)


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

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


Цитата mwz:
собственно, конкретную задачу можно понять из примеров »
Собственно, для этого надо быть Друзём, который еще и знает о функции "Воспроизводить в случайном порядке".

Без проверки на уникальность:
Код: Выделить весь код
dir c:\test\ -Filter *.mp3 | Rename-Item -NewName { "$(Get-Random -min 10000 -max 99999)-$($_.Name)";  }

-------
Канал Windows 11, etc | Чат @winsiders

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

Отправлено: 02:03, 28-08-2014 | #5


Ветеран


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

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


Цитата mwz:
Маленькая погрешность: не переименовались файлы, имена которых содержат восклицательный знак. »
Это особенность работы пакетных файлов с включённым режимом отложенного раскрытия переменных окружения (впрочем, аналогичные неприятные «особенности» наличествуют у всех языков, поддерживающих подобные «препроцессорные макросы»).

Приведённый ранее код можно заменить, например, таким, используя двойное раскрытие переменных окружения по «call»:
Код: Выделить весь код
@echo off
setlocal enableextensions disabledelayedexpansion

set sSourceFolder=%~1
set sTemplate=00000

if defined sSourceFolder (
	if exist "%sSourceFolder%\." (
		for /f "usebackq delims=" %%i in (
			`dir /b /a:-d "%sSourceFolder%\*.*" 2^>nul`
		) do (
			call set sPredicate=%sTemplate%%%random%%
			call ren "%sSourceFolder%\%%~i" "%%sPredicate:~-5%%_%%~i"
		)
	) else (
		echo Can't find source folder [%sSourceFolder%].
		exit /b 2
	)
) else (
	echo Usage: %~nx0 ^<Source folder^>
	exit /b 1
)

endlocal
exit /b 0
Цитата mwz:
Vadikan, собственно, конкретную задачу можно понять из примеров: [достаточно] случайным образом пересортировать порядок следования файлов с неслучайными именами. »
Заранее это понять сложно. Тем паче, что глобальная задача опять-таки неясна: зачем надо менять порядок следования файлов?

Если для воспроизведения — так ведь практически все известные мне плееры имеют функцию «перемешивания» файлов в списке. Можно даже просто составить список .m3u из исходных файлов в произвольном порядке и «скормить» его плееру.
Это сообщение посчитали полезным следующие участники:

Отправлено: 02:57, 28-08-2014 | #6

mwz mwz вне форума Автор темы

Аватара для mwz

Ушел из жизни


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

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


Vadikan, попробовал cmd-файл (Windows-7); увы:
"Rename-Item" не является внутренней или внешней командой, исполняемой программой или пакетным файлом.
(глубже пока не полез).

Цитата Iska:
Тем паче, что глобальная задача опять-таки неясна »
Извиняюсь, уже спал на ходу когда увидел и скрипт, и вопрос -- почему и ответил туманно и вкратце.

Да, задача чисто утилитарная: перемешивание музыкальных файлов, которые затем кидаются на флэшку формата FAT32 (плеер в автомобиле воспроизводит их в натуральном порядке, т.е. в порядке следования их в таблице FAT) и могут быть затем переименованы назад (почему и желательно было одинаковое число цифр: для автоматизации) с сохранением случайности порядка в таблице FAT.

.m3u -- у плеера с ними какие-то проблемы (похоже что в случае, если файл, стоящий на очереди, удалён с флэшки: после этого идёт сообщение типа "Неверный формат" и флэшку приходится перезаливать, поскольку перестаёт играть её вообще). Опять же список надо всё равно сортировать, что и отметил Vadikan.

Случайный порядок воспроизведение -- да, есть; но у алгоритма конкретного плеера оказались "свои музыкальные предпочтения": даже при количестве файлов порядка тысячи (5 знаков в исходном вопросе я взял с запасом, зная что на сложность решения это не должно повлиять) некоторые композиции он может прокрутить по пять раз в час, а некоторые -- раз в пару месяцев.

Промежуточный выход был найден: предварительная сортировка по размеру и скидывание в этом порядке (файлы, подготовленные к записи на флэшку, лежат жёсткими ссылками в отдельном каталоге и потихоньку пополняются, файлы же, удалённые с флэшки, переносятся отсюда в другую папку чтобы не зацепить их снова; установленная утилита LinkShellExtention зрительно проявляет жёсткие ссылки в основном каталоге и сразу видно, что файл или уже лежит в папке с подготовленными, или что заведомо не должен там лежать). Но некоторые длинные одинаковые композиции в разных вариациях оказались достаточно близки друг к другу.

А тут как раз надо перезалить флэшку -- и я рискнул задать вопрос, зная что каких-то трудностей он не должен вызвать (правда, думал что будет использован цикл for и переменная %random% -- то направление, которое я собирался попробовать, не сообразив что можно использовать dir с передачей результата на дальнейшую обработку, как в последнем скрипте у Vadikan; извинения за уточнение с восклицательными знаками: понятно что в данном случае это некритично, и пяток-десяток файлов можно и вручную потасовать).

-------
Mikhail Zhilin


Последний раз редактировалось mwz, 28-08-2014 в 11:31.


Отправлено: 11:19, 28-08-2014 | #7


(*.*)


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

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


mwz, это PowerShell, другую консоль надо открыть или так. Спасибо за развернутое описание задачи

-------
Канал Windows 11, etc | Чат @winsiders


Отправлено: 12:58, 28-08-2014 | #8


Ветеран


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

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


mwz, спасибо, теперь ясно. Разве что — я бы не переименовывал оригинальные файлы, а копировал результирующие файлы под новым именем в отдельный каталог.

Отправлено: 15:28, 28-08-2014 | #9

mwz mwz вне форума Автор темы

Аватара для mwz

Ушел из жизни


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

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


Цитата Iska:
я бы не переименовывал оригинальные файлы, а копировал результирующие файлы под новым именем в отдельный каталог »
Тут свои тараканы соображения. Иначе запутаюсь совсем.
А так и места не занимают (хардлинки ж, а их и переименовать без влияния на двойников в основном каталоге можно как угодно, и если изменять, типа добавления или правки тэгов в основном каталоге (и наоборот: в каталоге подготовленном для заливки) -- сразу и в хардлинках это будет отражено; при условии, разумеется, что не происходит удаления исходного файла с записью откорректированного на его место -- но в этом случае сразу пропадает метка жёсткой связи), и видно что где.

Цитата Vadikan:
это PowerShell »
Я уже так и прикинул. Но я тоже, мягко говоря, "слабо владею PowerShell", и он у меня даже не настроен. И даже не знаю, имеет ли смысл "учить старую собаку новым трюкам" в этой области: особых задач не предвидится...

PS
Vadikan,
Да, скрипт PowerShell я выполнил, запустив его окно и вставив команду (с учётом имени каталога).
Результат тоже хороший -- и тоже споткнулось на некоторых символах (на квадратной скобке, насколько понимаю); разделителем же стал не знак подчёркивания, а дефис, хотя в команде вижу именно знак подчёркивания. Ошибки обработки -- такие:
читать дальше »

Код: Выделить весь код
PS C:\temp> dir c:\temp -Filter *.mp3 | Rename-Item -NewName { "$(Get-Random -mi
n 10000 -max 99999)-$($_.Name)";  }
Rename-Item : Не удается выполнить переименование, так как элемент в "Microsoft
.PowerShell.Core\FileSystem::C:\temp\Caetano Veloso - Cafe Copacabana [C&B] - G
arota de Ipanema.mp3" не существует.
строка:1 знак:40
+ dir c:\temp -Filter *.mp3 | Rename-Item <<<<  -NewName { "$(Get-Random -min 1
0000 -max 99999)-$($_.Name)";  }
    + CategoryInfo          : InvalidOperation: (:) [Rename-Item], PSInvalidOp
   erationException
    + FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.R
   enameItemCommand

Rename-Item : Не удается выполнить переименование, так как элемент в "Microsoft
.PowerShell.Core\FileSystem::C:\temp\Dope Smugglaz - The World [pmt rmx].mp3" н
е существует.
строка:1 знак:40
+ dir c:\temp -Filter *.mp3 | Rename-Item <<<<  -NewName { "$(Get-Random -min 1
0000 -max 99999)-$($_.Name)";  }
    + CategoryInfo          : InvalidOperation: (:) [Rename-Item], PSInvalidOp
   erationException
    + FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.R
   enameItemCommand

Rename-Item : Не удается выполнить переименование, так как элемент в "Microsoft
.PowerShell.Core\FileSystem::C:\temp\Lil Jon & The Eastside Boyz - Crunk Juice
[06] Da Blow Ft. G.mp3" не существует.
строка:1 знак:40
+ dir c:\temp -Filter *.mp3 | Rename-Item <<<<  -NewName { "$(Get-Random -min 1
0000 -max 99999)-$($_.Name)";  }
    + CategoryInfo          : InvalidOperation: (:) [Rename-Item], PSInvalidOp
   erationException
    + FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.R
   enameItemCommand

-------
Mikhail Zhilin


Последний раз редактировалось mwz, 29-08-2014 в 00:13.


Отправлено: 23:14, 28-08-2014 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Вывод имён файлов файлов "по маске" SANIOK_AV Скриптовые языки администрирования Windows 2 17-07-2012 19:10
Разное - [решено] Как получить список файлов находящихся в каталоге? Kocuk Microsoft Windows 2000/XP 8 27-02-2012 23:25
Delphi - [решено] Случайные числа Ruzik Программирование и базы данных 5 13-11-2008 08:22
Ошибка - Искажение имён файлов vagifali Microsoft Windows 2000/XP 0 28-06-2008 15:38
Случайные числа на JavaScript Dimonweb Вебмастеру 2 12-08-2004 03:23




 
Переход