Показать полную графическую версию : Переименование файлов в папке по имени папки_счётчик
Sergo_zloy
04-03-2013, 17:55
Есть большое количество папок с разными именами. Все эти папки содержаться в одной исходной папке. В каждой папке содержатся по несколько файлов с разными именами.
Прошу помощи - нужен батник который будет переименовывать файлы в этих папках по названию папок_счётчик и записывать все эти переименованные файлы вместе с папками в другое место. В то время как исходное место (откуда эти файлы с папками берутся должно остаться неизменным.)
У самого никак не получается это реализовать.
Зарание спасибо.
Foreigner
04-03-2013, 20:18
Если правильно понял
@echo off
setlocal
set "sdir=c:\test"
set "ddir=d:\test"
pushd "%sdir%" || goto:eof
2>nul md "%ddir%"
for /f "tokens=*" %%i in (' dir /b /ad ') do (
pushd "%%i"
set "cnt=100"
for /f "tokens=*" %%j in (' dir /b /a ') do call:1 "%%j" "%%i"
popd
xcopy /e "%%i" "%ddir%\%%~i\"
)
popd
goto:eof
:1
set /a cnt+=1
ren %1 "%~2_%cnt:~-2%%~x1"
megaloman
04-03-2013, 20:52
Вот еще вариант (Если правильно понял :) )@Echo Off
SetLocal EnableExtensions EnableDelayedExpansion
FOR /D %%p IN ("D:\Папка номер 1\*.*") DO (
Set From=%%p
Set To=!From:D:\Папка номер 1=D:\Упорядоченная папка!
Set NewName=%%~nxp
If Not Exist "!To!\" md "!To!\"
Set i=1
FOR /F "usebackq delims=" %%f IN (`Dir "%%p\*.*" /A:-D /B /O:D /T:C 2^>nul`) DO (
Copy "!From!\%%f" "!To!\!NewName!_!i!" >nul
Set /A i=!i!+1
)
) Нумерую файлы от самых старых по времени создания. Если нужно по имени файла, то Dir должен иметь вид `Dir "%%p\*.*" /A:-D /B /O:N 2^>nul`
У меня файлы копируются, но в постановке непонятное выражение В то время как исходное место (откуда эти файлы с папками берутся должно остаться неизменным.) Если имеется ввиду, что файлов в исходном месте не должно быть, а остаться должны только исходные папки, то команду Copy заменить на Move
2All: я лично понял так, что придётся сначала скопировать, а затем уже переименовывать. Тогда исходные файлы останутся неизменными. Впрочем, подождём автора.
Sergo_zloy
05-03-2013, 00:07
Большое Спасибо!
Вы даже не представляете как помогли.
Скрипт от Foreigner это то что нужно. (только он переименовывает и в исходной папке и в той куда копирует.)
И ещё, желательно чтобы в переименованных файлах был после подчёркивания 1 символ (пример papka_1.jpg) и только если файлов больше десяти то начиная с десятого 2 символа (papka_10.jpg)
Скрипт от Megaloman тоже работает и переименовывает файлы только в той папке куда копирует, но те ставит разрешения файлов.
То есть в исходных папках все файлы, это картинки (.jpg), а переименованные теряют это разрешение, И ещё переименованные файлы не в том порядке получаются, как были в исходной папке. Но это я сам виноват.
Как написал в первом посте так и сделали. (никаких уточняющих факторов не написал)
Уточняю:
В исходных папках файлы могут называться так: document_1.jpg, document_2.jpg и так далее, нумерация по времени создания. (первым создан файл document_1.jpg потом document_2.jpg. и т.д)
Переименованные файлы должны быть в той же нумерации.
желательно чтобы в переименованных файлах был после подчёркивания 1 символ (пример papka_1.jpg) и только если файлов больше десяти то начиная с десятого 2 символа (papka_10.jpg) »
Очевидно, что у Вас и исходная нумерация файлов с переменным числом символов номера?могут называться так: document_1.jpg, document_2.jpg »А что будет, если число файлов больше 10?
Команда Dir, при сортировке по имени, выдает их в таком порядке:Document_1.jpg
Document_10.jpg
Document_11.jpg
Document_12.jpg
Document_13.jpg
Document_2.jpg
Document_3.jpg
Document_4.jpg
Document_5.jpg
Document_6.jpg
Document_7.jpg
Document_8.jpg
Document_9.jpg Тут уже простой сортировкой по имени не обойдешься.
Sergo_zloy
05-03-2013, 10:33
Очевидно, что у Вас и исходная нумерация файлов с переменным числом символов номера? »
Да это так. при создании папки файлы нумеруются в порядке создания.
А можно сделать так чтобы исходное имя файла менялась на название папки, но в конце имени оставалось это пtрвоначально созданное число. (было document_x.jpg, document_y.jpg ..... document_nn.jpg, а стало papka_x.jpg, papka_y.jpg .... papka_nn.jpg)
А можно сделать так чтобы исходное имя файла менялась на название папки, но в конце имени оставалось это пtрвоначально созданное число »
Можно, только нужно знать это исходное имя, и что эти имена постоянны для всех папок, т.е., имеют постоянную часть (например, document) которую и следует заменить на имя папки.
Примерно так:
@Echo Off
SetLocal EnableDelayedExpansion
Set folder=e:\Temp\3 3
Set OutFolder=e:\Temp\Out
xCopy /T "%folder%\*" "%OutFolder%\"
For /F "tokens=*" %%a In ('Dir /B /S /A:D "%folder%"') Do (
For /F "tokens=*" %%i In ('Dir /B /S /A:-D "%%~a" 2^>Nul') Do (
Set name=%%~ni
Copy "%%i" "%OutFolder%\%%~nxa\!name:document=%%~nxa!%%~xi"
)
)
Pause
megaloman
05-03-2013, 10:53
нужен батник который будет переименовывать файлы в этих папках по названию папок_счётчик - как просили, так и получили, про расширение тут нет ничего. Я сделал с расширением, плюс сделал выравнивание по номеру, не 1, 2,3 а 001 002 003 -считаю это более удобным. Замечание насчет замены Copy на Move остаётся в силе@Echo Off
SetLocal EnableExtensions EnableDelayedExpansion
FOR /D %%p IN ("D:\Папка номер 1\*.*") DO (
Set From=%%p
Set To=!From:D:\Папка номер 1=D:\Упорядоченная папка!
Set NewName=%%~nxp
If Not Exist "!To!\" md "!To!\"
Set i=1001
FOR /F "usebackq delims=" %%f IN (`Dir "%%p\*.*" /A:-D /B /O:D /T:C 2^>nul`) DO (
Set ii=!i!
Set ii=!ii:~-3!
Copy "!From!\%%f" "!To!\!NewName!_!ii!%%~xf" >nul
Set /A i=!i!+1
)
)
В исходных папках файлы могут называться так: document_1.jpg, document_2.jpg и так далее, нумерация по времени создания. (первым создан файл document_1.jpg потом document_2.jpg. и т.д) - похоже, Вы утаиваете реальную ситуацию, поэтому при нечёткой постановке задачи трудно делать то, что Вас удовлетворит. Что творится в исходной папке? Какие там файлы по имени? Пронумерованные или смесь нумерованных и любых?
Sergo_zloy
05-03-2013, 11:50
как просили, так и получили, про расширение тут нет ничего »
Да, каюсь, не все условия указал. Простите я не технарь! =(
Что творится в исходной папке? Какие там файлы по имени? Пронумерованные или смесь нумерованных и любых? »
В исходной папке все файлы пронумерованы по дате создания, то есть имя может быть любое, но потом идёт подчёркивание и номер файла. (уточнение: в пределах папки имена файлов одинаковы, разные только числовые значения в конце имени. В разных папках имена могут быть разные)
megaloman Спасибо вам огромное! Вы даже не представляете как помогли.
Ещё одна просьба. Подскажите какую литературу почитать, чтобы хоть чуть чуть начать разбираться в написании скриптов (bat файлов).
P.S. Благодарю всех за помощь! Сам бы я год до этого доходил.
megaloman
05-03-2013, 23:59
При такой постановке надёжнее выделять номер из имени исходного файла. Вот вариант решения (похоже, не очень элегантный)@Echo Off
SetLocal EnableExtensions EnableDelayedExpansion
FOR /D %%p IN ("D:\Папка номер 1\*.*") DO (
Set From=%%p
Set To=!From:D:\Папка номер 1=D:\Упорядоченная папка!
Set NewName=%%~nxp
If Not Exist "!To!\" md "!To!\"
FOR %%f IN ("%%p\*.*") DO (
Call :Number "%%~nf"
If Not !Num!==0 Copy "%%f" "!To!\!NewName!_!Num!%%~xf" >Nul
)
)
GoTo :Eof
:Number
Set Num=0
Set N=%~1
Set NN=%N:~-1%
Set M=%N:~-2%
If "%M:~0,1%"=="_" Set Num=00%NN%& GoTo :Eof
Set NN=%N:~-2%
Set M=%N:~-3%
If "%M:~0,1%"=="_" Set Num=0%NN%& GoTo :Eof
Set NN=%N:~-3%
Set M=%N:~-4%
If "%M:~0,1%"=="_" Set Num=%NN%& GoTo :Eof
Ограничение: Пронумерованных файлов в папке не может быть более 999. При желании эту цифру можно увеличить. При отсутствии номера, символа _ перед ним, превышения числа ограничения файл скопирован не будет
Замечание насчет замены Copy на Move остаётся в силе
В исходной папке все файлы пронумерованы »
@Echo Off
SetLocal EnableDelayedExpansion
Set folder=e:\Temp\3 3
Set OutFolder=e:\Temp\Out
xCopy /T "%folder%\*" "%OutFolder%\"
For /F "tokens=*" %%a In ('Dir /B /S /A:D "%folder%"') Do (
For /F "tokens=*" %%i In ('Dir /B /S /A:-D "%%~a" 2^>Nul') Do (
Set name=%%~ni
Call :_ExtractN
Copy "%%i" "%OutFolder%\%%~nxa\%%~nxa_!name!%%~xi"
)
)
Pause
Exit
:_ExtractN
Set name=%name:*_=%
If Not "%name%"=="%name:*_=%" GoTo :_ExtractN
GoTo :EOF
Возможно для кого-то несложно будет написать скрипт создания папок от 01 до 12?
Самое простое:
@echo off
setlocal enableextensions enabledelayedexpansion
for /l %%i in (1, 1, 9) do md "0%%i"
for /l %%i in (10, 1, 12) do md "%%i"
endlocal
exit /b 0
Можно, конечно, и одним проходом — с дополнительной переменной, обрезанием с конца, но так проще.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.