Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Переименование файлов в папке по имени папки_счётчик (http://forum.oszone.net/showthread.php?t=255486)

Sergo_zloy 04-03-2013 17:55 2104043

Переименование файлов в папке по имени папки_счётчик
 
Есть большое количество папок с разными именами. Все эти папки содержаться в одной исходной папке. В каждой папке содержатся по несколько файлов с разными именами.
Прошу помощи - нужен батник который будет переименовывать файлы в этих папках по названию папок_счётчик и записывать все эти переименованные файлы вместе с папками в другое место. В то время как исходное место (откуда эти файлы с папками берутся должно остаться неизменным.)


У самого никак не получается это реализовать.

Зарание спасибо.

Foreigner 04-03-2013 20:18 2104145

Если правильно понял
Код:

@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 2104170

Вот еще вариант (Если правильно понял :) )
Код:

@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 2104199

2All: я лично понял так, что придётся сначала скопировать, а затем уже переименовывать. Тогда исходные файлы останутся неизменными. Впрочем, подождём автора.

Sergo_zloy 05-03-2013 00:07 2104347

Большое Спасибо!

Вы даже не представляете как помогли.

Скрипт от 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 2104449

Цитата:

Цитата Sergo_zloy
желательно чтобы в переименованных файлах был после подчёркивания 1 символ (пример papka_1.jpg) и только если файлов больше десяти то начиная с десятого 2 символа (papka_10.jpg) »

Очевидно, что у Вас и исходная нумерация файлов с переменным числом символов номера?
Цитата:

Цитата Sergo_zloy
могут называться так: 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 2104506

Цитата:

Цитата gora
Очевидно, что у Вас и исходная нумерация файлов с переменным числом символов номера? »

Да это так. при создании папки файлы нумеруются в порядке создания.

А можно сделать так чтобы исходное имя файла менялась на название папки, но в конце имени оставалось это п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 2104515

Цитата:

Цитата Sergo_zloy
А можно сделать так чтобы исходное имя файла менялась на название папки, но в конце имени оставалось это п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 2104516

Цитата:

нужен батник который будет переименовывать файлы в этих папках по названию папок_счётчик
- как просили, так и получили, про расширение тут нет ничего. Я сделал с расширением, плюс сделал выравнивание по номеру, не 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 2104554

Цитата:

Цитата megaloman
как просили, так и получили, про расширение тут нет ничего »

Да, каюсь, не все условия указал. Простите я не технарь! =(

Цитата:

Цитата megaloman
Что творится в исходной папке? Какие там файлы по имени? Пронумерованные или смесь нумерованных и любых? »

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


megaloman Спасибо вам огромное! Вы даже не представляете как помогли.

Ещё одна просьба. Подскажите какую литературу почитать, чтобы хоть чуть чуть начать разбираться в написании скриптов (bat файлов).


P.S. Благодарю всех за помощь! Сам бы я год до этого доходил.

megaloman 05-03-2013 23:59 2105096

При такой постановке надёжнее выделять номер из имени исходного файла. Вот вариант решения (похоже, не очень элегантный)
Код:

@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 2105332

Цитата:

Цитата Sergo_zloy
В исходной папке все файлы пронумерованы »

Код:

@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 2290725

Возможно для кого-то несложно будет написать скрипт создания папок от 01 до 12?

Iska 17-01-2014 16:58 2290955

Самое простое:
Код:

@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

Можно, конечно, и одним проходом — с дополнительной переменной, обрезанием с конца, но так проще.


Время: 06:27.

Время: 06:27.
© OSzone.net 2001-