Показать полную графическую версию : [решено] Переименование папок по маске
Есть папки с именами F-LDR*. Нужно добавить к их именам суффикс __MY, т.е. привести к виду F-LDR*__MY.
И противоположная задача (более важная):
Есть папки с именами F-LDR*__MY. Нужно убрать из их имен суффикс __MY, т.е. привести к виду F-LDR*.
(ReNamer такое делает, в т.ч. и с папками, но хотелось бы то же выполнять из пакетного файла - быстрее и удобнее).
Интересует только CMD/BAT.
Все папки непустые, будут лежать в одном каталоге и на одном уровне с требующимся батником; подпапки не трогать.
(Гуглил, но ничего подобного для папок не нашел... Если возможно, научите. Спасибо!)
С такой постановкой задачи:
Интересует только CMD/BAT. »
Вот это вряд ли:
Если возможно, научите. Спасибо!) »
Хотя, в принципе, можно примерно так:
for /f "delims=" %%i in ('dir /b/ad "F-LDR<"') do echo ren "%%~i" "%%~i__MY"
echo - в боевых условиях удалить.
обратное действие, тоже можно накидать подобным способом, через цикл, только имена каталогов придется передавать через промежуточную переменную и затем, заменой удалять ненужные символы, примерно так:
... do (
set "var=%%~i"
echo ren "%%~i" "!var:__MY=!"
)
восклицательный знак тут не случайно, ибо внутри скобок придется использовать отложенное раскрытие... ну или использовать вызов call и стандартное %-раскрытие...
ЗЫ
Но возникает закономерный вопрос: Вам шашечки или ехать?
Лучше изучайте повершелл, в нем многое гораздо проще делать... :)
можно примерно так: »
Туда попадают и ранее переименованные каталоги, наподобие:
C:\Мои проекты\0235\01>dir /b/ad "F-LDR<"
F-LDR001__MY
F-LDR002
F-LDR003__MY
F-LDR004
Колитесь, коллега, откуда брали про «<» в маске, и что он даёт?
Туда попадают и ранее переименованные каталоги, наподобие: »
Ну, тут надо выбирать, либо туда, либо сюда... то бишь, сначала удаляем суффиксы, потом все скопом переименовываем, как требуется.
К тому же, в условии не сказано, что там уже присутствуют каталоги с суффиксами... :)
Колитесь, коллега, откуда брали про «<» в маске, и что он даёт? »
Дежавю (http://forum.oszone.net/post-2833474.html#post2833474), однако. :)
YuS_2, спасибо!
Хотя, в принципе, можно примерно так: »
F-LDR* to F-LDR*__MY работает отлично. :up Но гораздо больше чисто практически интересует что-то подобное именно для F-LDR*__MY to F-LDR*, т.к. можно было бы вставить готовый код в мой "рабочий" батник - поэтому:
Интересует только CMD/BAT. »
А что касается:
Лучше изучайте повершелл »
, то если бы написание более-менее сложных скриптов было бы каждодневной необходимостью (а не от случая к случаю), то так бы и сделал... (наверное, уже на пенсии).
Другими словами, на сегодняшнй день очень интересует:
Есть папки с именами F-LDR*__MY. Нужно убрать из их имен суффикс __MY, т.е. привести к виду F-LDR*. »
Вот только:
тоже можно накидать подобным способом »
- это точно не с моими теперешними навыками... Выручайте... :pray:
Дежавю, однако. »
Угу. Ну, ещё раза два-три спрошу, опосля, может быть, запомню :lol:.
dassen, что делать, если есть, например, и каталог F-LDR003, и каталог F-LDR003__MY?
@echo off
setlocal enableextensions enabledelayedexpansion
for /f "usebackq delims=" %%i in (
`2^>nul dir /b /a:d ^| findstr.exe /i /r /c:"^F-LDR.*" ^| findstr.exe /i /v /r /c:".*__MY$"`
) do (
if not exist "%%~i__MY\." (
echo Rename folder [%%~i] into [%%~i__MY].
ren "%%~i" "%%~i__MY"
) else (
echo Can't rename folder [%%~i] into [%%~i__MY] because folder [%%~i__MY] already exists.
)
)
endlocal
exit /b 0
…and…@echo off
setlocal enableextensions enabledelayedexpansion
for /f "usebackq delims=" %%i in (
`2^>nul dir /b /a:d ^| findstr.exe /i /r /c:"^F-LDR.*__MY$"`
) do (
set sFolderName=%%~i
set sNewFolderName=!sFolderName:~0,-4!
if not exist "!sNewFolderName!\." (
echo Rename folder [%%~i] into [!sNewFolderName!].
ren "%%~i" "!sNewFolderName!"
) else (
echo Can't rename folder [%%~i] into [!sNewFolderName!] because folder [!sNewFolderName!] already exists.
)
)
endlocal
exit /b 0
Немного помыслил... :lamer:
В принципе, мне все равно, каким суффиксом изначально было для себя метить папки F-LDR*. Главное - чтобы можно было в нужный момент этот суффикс отбросить.
И если использовать суффикс
.__MY вместо __MY
, то с задачей F-LDR*.__MY to F-LDR* вполне справится этот код:
for /f %%i in ('dir /b/ad "F-LDR*.__MY"') do ren "%%i" "%%~ni"
(на идею натолкнул код от YuS_2 :bow: ).
Необычно? Но работает. Может, что-то "по-грамотному" подправить/добавить? ;)
"А можно такое же, но без точки?" :)
P.S.
Отправил это сообщение еще до того, как обнаружил, что уже есть предыдущее от Iska.
Прошу учесть...
Iska, спасибо! Именно то, что требовалось! :laiel:
dassen, что делать, если есть, например, и каталог F-LDR003, и каталог F-LDR003__MY? »
Именно то, что и делает ваш There.cmd:
к F-LDR* добавлять суффикс __MY
к F-LDR*__MY еще один суффикс __MY добавлять не нужно.
P.S.
Если бы прочитал Ваше сообщение до написания своего
Немного помыслил... »
, то свое бы уже не писал. :no:
megaloman
07-01-2019, 13:18
@Echo Off
cls
Set "Pref=F-LDR"
Set "Suff=__MY"
Set "Ext=.*"
Set "BoxIn=%~dp0"
If "%BoxIn:~-1%"=="\" Set "BoxIn=%BoxIn:~0,-1%"
FOR /F "usebackq delims=" %%d IN (`2^>nul Dir "%BoxIn%\%Pref%*%Suff%%Ext%" /B /A:D`) DO (
Call :MyDel "%BoxIn%\%%d" "%Suff%"
)
Pause
GoTo :Eof
rem Удаление суффикса
:MyDel
Set "Name=%~n1:"
Call Set "Name=%%Name:%~2:=%%"
If Not "%~n1:%~x1"=="%Name%%~x1" Ren %1 "%Name%%~x1" ||(Echo Ren %1 --^> "%Name%%~x1" already exists &Echo.)
GoTo :Eof@Echo Off
cls
Set "Pref=F-LDR"
Set "Suff=__MY"
Set "Ext=.*"
Set "BoxIn=%~dp0"
If "%BoxIn:~-1%"=="\" Set "BoxIn=%BoxIn:~0,-1%"
FOR /F "usebackq delims=" %%d IN (`2^>nul Dir "%BoxIn%\%Pref%*%Ext%" /B /A:D`) DO (
Call :MyAdd "%BoxIn%\%%d" "%Suff%"
)
Pause
GoTo :Eof
rem Добавление суффикса если его еще нет
:MyAdd
Set "Name=%~n1:"
Call Set "Name=%%Name:%~2:=%%"
If "%~n1:%~x1"=="%Name%%~x1" Ren %1 "%~n1%~2%~x1" ||(Echo Ren %1 --^> "%~n1%~2%~x1" already exists &Echo.)
GoTo :Eof.__MY » Это уже не суффикс, а окончание (или, как принято, расширение), и для него надо спеть другую песТню.F-LDRkuku__MY
F-LDRkuku__MY.ttt
F-LDRkuku__MY.__MY
F-LDRтра ля ля__MY
F-LDRтра ля ля__MY.kkk
F-LDRтра ля ля__MY.__MY
- это точно не с моими теперешними навыками... Выручайте... »
Дык, это же почти готовое решение, т.е. берем этот код:
for /f "delims=" %%i in ('dir /b/ad "F-LDR<"') do echo ren "%%~i" "%%~i__MY"
и превращаем его в такой:
@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%i in ('dir /b/ad "F-LDR<"') do (
set "var=%%~i"
echo ren "%%~i" "!var:__MY=!"
)
YuS_2, спасибо.
Опробовал. Так убираются из имен все __MY, которые встречаются в любом количестве не только как суффикс, но и в любом месте *-части имени.
Но мне (как вариант) это подходит, т.к. в моем (частном) случае 1 шт. __MY и только как суффикс, т.е. ничего лишнего не удалится.
И компактно!
не только как суффикс, но и в любом месте »
Это да, так работает замена в cmd.
Но если надо что-то более точное, то присмотреться необходимо к powershell и регэкспам, с ними всё гораздо проще решается.
megaloman
07-01-2019, 16:05
dassen, Если Вам всё равно, в каком месте убивается __My, если надо чтобы кратко (что мне совсем не нравится, удобнее иметь легко настраиваемый код):@Echo Off
rem Удалить
FOR /F "usebackq delims=" %%d IN (`2^>nul Dir "F-LDR*__My.*" /B /A:D`) DO Set "N=%%d" &Call Ren "%%d" "%%N:__My=%%"
rem Добавить
FOR /F "usebackq delims=" %%d IN (`2^>nul Dir "F-LDR*.*" /B /A:D`) Do Ren "%%d" "%%~nd__My%%~xd"
Если только удалить, красные строки убираем
Если добавить (при этом чтобы суффиксы не дублировались, сначала их удаляем) - оставляем все строки
И, чтобы совсем кратко, убиваем строки с Rem
При использовании
setlocal enabledelayedexpansion
будут проблемы с именами папок, если в именах есть "!"
megaloman, спасибо.
При использовании
setlocal enabledelayedexpansion
будут проблемы с именами папок, если в именах есть "!" »
Проверил... Проблемы - не то слово:
"!" в имени - и имя папки просто не обрабатывается (мне пока среди моих F-LDR*такие не попадались, но кто знает...)
кратко (что мне совсем не нравится, удобнее иметь легко настраиваемый код) »
Да мне всего лишь нужна раз-навсегда написанная (и лучше единственная) строка для "удалить", которую я добавлю в мой "рабочий" батник. Корректирую свои требования: пусть она сносит все __MY, где бы она их ни нашла (ведь найдет она их только как суффиксы). И, по-моему, Ваш крайний вариант идеален.
А что касается "добавить" - здесь я за краткостью не гонюсь, и вопросы у меня еще будут (не сегодня).
kolob204
13-05-2020, 13:40
А как рекурсивно по всем подкаталогам пройтись таким переименованием?
megaloman
13-05-2020, 16:25
@Echo Off
Call :DelSuff "Z:\Box_In\F-LDR*__My.*" "__My"
Call :AddSuff "Z:\Box_In\F-LDR*.*" "__My"
Exit /B
:DelSuff
FOR /F "usebackq delims=" %%d IN (`2^>nul Dir %1 /S /B /A:D ^|Sort /R`) DO (
Set "N=%%~nd" &Call Ren "%%d" "%%N:__My=%%%%~xd"
)
Exit /B
:AddSuff
FOR /F "usebackq delims=" %%d IN (`2^>nul Dir %1 /S /B /A:D ^|Sort /R`) DO (
Call Ren "%%d" "%%~nd%~2%%~xd"
)
Exit /B
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.