Войти

Показать полную графическую версию : Переименование файлов в папке по имени папки_счётчик


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

Iska
04-03-2013, 21:23
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. и т.д)

Переименованные файлы должны быть в той же нумерации.

gora
05-03-2013, 08:52
желательно чтобы в переименованных файлах был после подчёркивания 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)

gora
05-03-2013, 10:51
А можно сделать так чтобы исходное имя файла менялась на название папки, но в конце имени оставалось это п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 остаётся в силе

gora
06-03-2013, 11:49
В исходной папке все файлы пронумерованы »
@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

AlexLev
17-01-2014, 10:06
Возможно для кого-то несложно будет написать скрипт создания папок от 01 до 12?

Iska
17-01-2014, 16:58
Самое простое:
@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