Страница 1 из 2

Массовое переименовывание файлов в подкаталогах

Добавлено: Вс май 30, 2010 17:40
deniel87
Доброго дня.Нужно решить вот такую задачку.Имееться папка допустим [FILES] в этой папке находяться подпапки вида 0001,0002,0003....0999.В каждой из этих подпапок содержиться некоторое количество файлов (от 10 до 30).Нужно переименовать файлы в каждой подпапке по счетчику.

ПРИМЕР

FILES/0001/01.txt
FILES/0001/02.txt
FILES/0001/03.txt
и т.д


FILES/0002/01.txt
FILES/0002/02.txt
FILES/0002/03.txt
и т.д

в каждой папке нумерация файлов должна быть 01,02,03...и т.д

прблема в том что все программы которыми я пробовал переименовывать отказывались работать с подкаталогами.Можно конечно использовать груповое переименовывание в TС, но в ручную 1000 папок как то долговато будет)))Надеюсь суть вопроса понятна.Заранее спасибо.

Добавлено: Вс май 30, 2010 19:44
Вахмурка
Про имена исходных файлов ничего не сказано. Допустим, что они имеют одинаковые имена в разных директориях:

Код: Выделить всё

FILES/0001/a.txt
FILES/0001/b.txt
FILES/0001/c.txt
тогда задача легко решается батником

Код: Выделить всё

ren a.txt 001.txt
ren b.txt 002.txt
Затем через команду for в батнике сделать обход всех директорий и в каждой выполнить данный набор команд. Ничего лучше в голову не приходит. Попробовал поиграться с вложенными командами for, но ничего не получилось.
Подожди, скоро придет Tol!k и напишет тебе батник.

Добавлено: Вс май 30, 2010 20:01
Flasher
deniel87 писал(а):Можно конечно использовать груповое переименовывание в TС, но в ручную 1000 папок как то долговато будет)
Хм. А дерево на что? Ctrl+F8, выделил нужные папки и понеслась. :wink:

Добавлено: Вс май 30, 2010 20:25
Вахмурка
По-моему, директории ему-то как раз переименовывать не надо. Дерево здесь не поможет. И вообще, выделение директорий к дереву отношения не имеет. Или я чего-то не понял?

Добавлено: Вс май 30, 2010 21:25
Tol!k
Flasher, нужна не сквозная нумерация, а "в каждой папке нумерация файлов должна быть 01,02,03..."

Добавлено: Вс май 30, 2010 21:25
Flasher
Что-то меня и правда не туда понесло. Ctrl+Shift+B в дереве всё равно не сработает по понятным причинам, хотя Гислеру бы не мешало предложить, чтобы по некой команде, например, cm_DirBranchTreeSel и по клавише Ctrl+Alt+B все файлы из выделенных папок выводились в другой панели.
Жаль, что папок так много, в строке поиска не поместятся. Но на всякий предлагаю выделить в дереве папки, сохранить выделение в файл, а потом либо Batya, либо Tol'k свояют скрипт, тем более, что на форуме списки обрабатывались ими не единожды. Например, тут, тут, где-то ещё есть..

Добавлено: Вс май 30, 2010 21:52
Tol!k
О, так всё ж уже написано! Flasher, где ты был раньше, я успел батник написать :evil:
deniel87
заменяешь в скрипте

Код: Выделить всё

Const Precision = 2
и

Код: Выделить всё

'      NewName = G & Delimiter & P & Delimiter & GeneralWord & Delimiter & Num(Counter(PF), Precision) & Ext
       NewName = Num(Counter(PF), Precision) & Ext
жмёшь Ctrl+B, выделяешь файлы;
нажимаешь кнопку и выпиваешь за здоровье Бати

Добавлено: Вс май 30, 2010 22:45
Flasher
Tol!k писал(а):жмёшь Ctrl+B, выделяешь файлы; нажимаешь кнопку
А если вложенность разная, и файлы не из всех подкаталогов надо обрабатывать, то как быть?
Tol!k писал(а):Flasher, где ты был раньше, я успел батник написать :evil:
На сколько? На пол секунды? :lol:

Добавлено: Вс май 30, 2010 23:00
Tol!k
Flasher писал(а):А если вложенность разная, и файлы не из всех подкаталогов надо обрабатывать, то как быть?
В запросе ничего про выборочное переименование, а с разной вложенностью скрипт справляется.
Tol!k писал(а):На пол секунды? :lol:
Да я на себя злой, что делал бесполезную работу. Ну ты понял :)

Добавлено: Вс май 30, 2010 23:29
Flasher
Tol!k писал(а):В запросе ничего про выборочное переименование, а с разной вложенностью скрипт справляется.
Пока да, ну вот, допустим, я поставил. Нужно файлы, находящиеся в разных по вложенности подкаталогах, например, выделенные выборочно в дереве, переименовывать с учётом предложенного алгоритма.
Tol!k писал(а):Ну ты понял
Само собой. :wink:

Добавлено: Пн май 31, 2010 00:00
Tol!k
Flasher писал(а):Нужно файлы, находящиеся в разных по вложенности подкаталогах, например, выделенные выборочно в дереве, переименовывать с учётом предложенного алгоритма.
Пробуй

Код: Выделить всё

@echo off &chcp 1251 >nul &setlocal enableextensions

rem  Файлы, находящиеся в папках, например, выделенных выборочно в дереве,
rem  переименовываются по счётчику [0-9][0-9].*
rem  Счётчик начинается с 01 в каждой папке.
rem  Файлы подходящие под маску [0-9][0-9].* остаются без изменения.
rem  Параметры: список_папок /S
rem    /S – переименовывать файлы во вложенных папках
rem  Пример параметров при вызове из TC: %L
rem  Автор: Tol!k

for /f "usebackq delims=" %%d in ("%~1") do call :d "%%d"
if /i "%~2"=="/s" for /f "delims=" %%d in (
'for /f "usebackq delims=" %%s in ^("%~1"^) do @dir /s/b/ad "%%s"'
) do call :d "%%d"
goto :eof

:d
set /a cnt=0
for /f "delims=" %%f in ('dir /b/a-d/on "%~1" ^|^
findstr /v /i /r /b /e /c:"[0-9][0-9]\.[^^\.]*"') do call :f "%~1\%%f"
goto :eof

:f
set /a cnt+=1
if "%cnt%"=="100" (title STOP &echo Досчитали до 100. &pause >nul &exit)
set "name=0%cnt%"
set "name=%name:~-2%"
ren %1 "%name%%~x1" 2>nul &&title %name% "%~dp1" ||call :f %1
goto :eof
Выделять нужно папки, а не файлы.
Файлы подходящие под маску [0-9][0-9].* остаются без изменения (в отличии от Батиного скрипта)

Добавлено: Пн май 31, 2010 01:15
deniel87
Спасибо Tol!k второй скрипт самое оно!

Добавлено: Пн май 31, 2010 13:41
Tol!k
Изменение: теперь при работе не создаётся временный файл

Добавлено: Пн май 31, 2010 14:58
Flasher
Tol!k
Вот и не бесполезная вовсе работа оказалась. Работает чётко! Молоток! :)
Но вот чего бы ещё хотелось, так это переименования файлов во вложенных на разную глубину подкаталогах, если при этом выделен (помимо всех прочих) только корневой. Сделаешь? :roll:

Добавлено: Вт июн 01, 2010 13:02
Tol!k
+ Доп. параметр /S – переименовывать файлы во вложенных папках