Показать полную графическую версию : [решено] Переименование файлов с заменой символов по маске
Constantant
25-01-2010, 13:43
Здравствуйте!
Нужно очень сделать батничек, который переименовывает файлы PDF, а конкретнее заменяет в названиях существующих файлов символы " ", "_","+","=","&" на "-".
Я сделал что так что бы заменял только один символ, а вот как подставит регулярное выражение не пойму.
renamer.bat:
for %%g in (*.pdf) do call :s_subroutine "%%~nxg" "%%g"
:s_subroutine
set _sss=%1
set _ddd=%_sss:_=-%
ren %2 %_ddd%
goto :eof
set _ddd=%_sss:_=-% вот эта строка заменяет все символы "_" на символ "-", а вот как здесь пристроить регулярное выражение мне не понятно.
Спасибо.
El Sanchez
25-01-2010, 20:56
Пример с использованием утилиты sed:
@echo off
for /f "usebackq tokens=*" %%a in (`dir /b *.pdf`) do call :func "%%~na"
goto :eof
:func
for /f "tokens=*" %%a in ('echo %1^|sed /^"[ _^=+^&]^"/s//-/g^|sed /\^"/s///g') do ren %1.pdf %%a.pdf
Constantant
25-01-2010, 22:27
спасибо большое!
а без sed вообще ни как?
без sed вообще ни как? »штатными средствами CMD никак, т.к. заменяемые символы являются метасимволами самого CMD... кроме того, в Windows отсутствуют штатные утилиты по замене текста (тем более через RegExp), так что варианта два:
- использовать сторонние CMD-утилиты типа SED (коих немеренно);
- задействовать в решении скрипты на VBS или PowerShell.
Кстати, еще вариант на SED (из комплекта UnxUtils (http://sourceforge.net/projects/unxutils/)): :)
For /F "Delims=" %%i In (
'DIR /B *.pdf^|SED "s/.$//;s/.*/\"\0\"/;h;s/[ _+=&]/-/g;x;G;s/\n/ /"'
) Do REN %%i
Constantant
26-01-2010, 10:41
штатными средствами CMD никак »
Я уже смирился с этим :yes:
Кстати, еще вариант на SED »
вот только я не пойму как этот Sed применять.. как его устанавливать?
то что в хелпе мне не очень понятно)
пример хотелось бы увидеть)
Большое спасибо за отзывы :)
Я уже смирился с этим »
тогда немного изврата не будет лишним: ;)
@Echo Off
For %%Z In (*.pdf) Do For /F "Tokens=1-26 Delims=&=_+ " %%a In ("%%Z") Do (
Set $T="%%a-%%b-%%c-%%d-%%e-%%f-%%g-%%h-%%i-%%j-%%k-%%l-%%m-%%n-%%o-%%p-%%q-%%r-%%s-%%t-%%u-%%v-%%w-%%x-%%y-%%z"
Set $F="%%Z"& CALL :SUB_REN )
Exit /B 0
:SUB_REN
If %$T:~-2,1%==- Set $T=%$T:-"="%& GoTo SUB_REN
REN %$F% %$T%& GoTo :EOF
то что в хелпе мне не очень понятно »
инфы всякой много, хотя бы тут: Просто о sed (http://azarkevich.blogspot.com/2008/03/sed.html)
Constantant
26-01-2010, 12:31
ни один из вышеприведённых скриптов не работает...
я попытался сделать вот так:
for %%g in ("C:\kharitonov\My Documents\PDF\*.pdf") do call :s_subroutine "%%~nxg" "%%g"
:s_subroutine
set aaa=%1^|SED "s/.$//;s/.*/\"\0\"/;h;s/[ _+=&]/-/;x;G;s/\n/ /"
ren %2 %aaa%
goto :eof
но всё равно ни чего не выходит...
я 3 дня знаком с шелом... помогите, пожалуйся, ни чего не понимаю.
ни один из вышеприведённых скриптов не работает »
скрипты для запуска из текущего каталога с *.PDF, т.е. нужно предварить CD или PushD
Constantant
26-01-2010, 12:35
тогда немного изврата не будет лишним: »
а вот это реально работает))))
но всё же хотелось бы разобраться с SED...
нужно предварить CD или PushD »
чувствую себя идиотом :unsure:
всё же хотелось бы разобраться с SED »
опечатку исправил, пример команды разбора:
DIR /B/A-D *.pdf|SED "s/[ _&+=]/-/g"
чувствую себя идиотом »
CD C:\kharitonov\My Documents\PDF
...PUSHD C:\kharitonov\My Documents\PDF
...справка по команде:PUSHD /?
Constantant
26-01-2010, 13:01
спасибо)
будем вникать)
El Sanchez
26-01-2010, 15:25
а без sed вообще ни как? »
Еще один изврат (сценарий обязательно сохранить в кодировке DOS (OEM866)):
@Echo off
::"¬" это ALT+0172
Setlocal ENABLEDELAYEDEXPANSION
for /f "usebackq tokens=*" %%a in (`dir /b *.pdf`) do (
set Out=
set /a i=-1
set "Str=%%~na"
set "Str=!Str:_=-!"
set "Str=!Str:+=-!"
set "Str=!Str: =-!"
set "Str=!Str:&=-!"
call :func
ren "%%a" !Str!.pdf
)
Endlocal
goto :eof
:func
set /a i+=1
call :parse set "char=%%Str:~%i%,1%%"
if "%Char%"=="" (
set "Str=!Out:¬=-!"
goto :eof
)
if "%Char%"=="=" set Char=¬
set "Out=!Out!%Char%"
call :func
:parse
%*
Еще один изврат »
Класс!.. Но он не позволяет менять "!"... Если не против, немного доработал:
@Echo Off
For %%Z In (*.pdf) Do Set "NameOld=%%Z"& Call :ReName
Exit /B 0
:ReName
Set NameLen=0& Set NameNew=
:ReNameLoop
Call Set "$C=%%NameOld:~%NameLen%,1%%"
Set /A NameLen+=1
If Not "%$C%"==" " If Not "%$C%"=="_" If Not "%$C%"=="+" If Not "%$C%"=="&" If Not "%$C%"=="=" (
If Not "%$C%"=="" Set "NameNew=%NameNew%%$C%"& GoTo :ReNameLoop )
If Not "%$C%"=="" Set "NameNew=%NameNew%-"& GoTo :ReNameLoop
REN "%NameOld%" "%NameNew%"
GoTo :EOF
Constantant, решено (http://forum.oszone.net/faq.php?faq=vb_board_usage#faq_solved_thread_faq) ?
El Sanchez
27-01-2010, 10:44
Но он не позволяет менять "!" »
Так и не требуется ж :)
Если не против, немного доработал »
amel27,
Вещь! И не надо подстановку делать, простое посимвольное сравнение.
Кстати, сравнил время выполнения моего сценария с вашим. Сгенерировал 1000 текстовых файлов с уникальными именами (%random%ы, разделенные этими 5 символами) и включил секундомер. Мой сценарий выполнился в среднем за 1:51.8 мин., а ваш за 1:28.2 мин., так что Constantant, берите последний вариант.
Constantant
27-01-2010, 13:07
Ребята, вы все молодцы!
Всем спасибо!
Очень помогли :yahoo: :clapping: !
вдогонку по теме - случайно наткнулся на утилиту FART (http://fart-it.sourceforge.net/) (Find And Replace Text), которая кроме прочего может переименовывать файлы... к сожалению, для замены каждого символа потребовалась отдельная команда:
fart -f *.pdf "_" "-"
fart -f *.pdf "+" "-"
fart -f *.pdf "&" "-"
fart -f *.pdf "=" "-"
fart -f *.pdf " " "-"
Devils0411
14-08-2010, 02:54
Похожая ситуация... Только необходимо заменить символ "\" на "/" в текстовом файле.
Devils0411,
Option Explicit
Dim FSO, TextStream, File, strContents, Document
Set FSO = CreateObject("Scripting.FileSystemObject")
Set File = FSO.GetFile("путь_к_файлу\input.txt") ' Исходный файл для обработки
Set TextStream = File.OpenAsTextStream()
Set Document = FSO.CreateTextFile("путь_к_файлу\output.txt") ' Выходной файл
strContents = TextStream.ReadAll()
Document.Write(Replace(strContents,"\","/")) ' Параметры замены
Document.Close
Devils0411
14-08-2010, 13:21
deepred, только хотелось бы все же средствами cmd, или cmd + какая-нибудь утилитка для замены символов.
Devils0411,
Echo off
Set "Loctn=F:\change symbol\" & rem расположение файла
CD %Loctn%
for /f "tokens=* delims=" %%a in (file.txt) do call :replace "%%a"
:loop
IF Exist TMP (TYPE TMP > file.txt && Del TMP) else goto loop
goto :Eof
:replace
Set $TXTin=%~1
Set $TXTout=%$TXTin:\=/%
Echo %$TXTout% >> TMP
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.