Как переименовать кучу каталогов в windows?

403
user648026

Я хотел бы изменить имя каталога с

view_pictures personal_pictures scenic_pictures 

в

2017_view_pictures 2017_personal_pictures 2017_scenic_pictures 

Внутри каждой папки есть файлы, и это всего лишь вымышленный пример, в исходном каталоге более 20 тысяч подкаталогов, поэтому ручное переименование невозможно.
Я попытался получить список с помощью команды tree,
поэтому я могу манипулировать списком с помощью notepad ++ и некоторых регулярных выражений,
но tree не даст полный путь, поэтому я могу сгенерировать команду.

Это структура каталогов:

root path picsfromA view_pictures personal_pictures picsfromB view_pictures personal_pictures scenic_pictures picsfromC personal_pictures scenic_pictures picsfromD personal_pictures picsfromN scenic_pictures 

это желаемая структура каталогов:

root path picsfromA 2017_view_pictures 2017_personal_pictures picsfromB 2017_view_pictures 2017_personal_pictures 2017_scenic_pictures picsfromC 2017_personal_pictures 2017_scenic_pictures picsfromD 2017_personal_pictures picsfromN 2017_scenic_pictures 

ОБНОВЛЕНИЕ
Я также пытаюсь так:
трудная часть состоит в том, чтобы сломать строку пути и восстановить ее.

@echo off SETLOCAL set folder_path=%%f for /D /r %%f in (*) do ( set folder_path=%%f echo %folder_path%  if "%folder_path:~-13%" EQU "view_pictures" ( REM path without last folder name REM construct path without folder name REM [ren old folder], [new folder.] )  ) 
2
Вы должны взглянуть на утилиту массового переименования - - http://www.bulkrenameutility.co.uk/Main_Intro.php Anaksunaman 6 лет назад 1
Все было бы намного проще, если бы у вас был WSL и Windows 10 (если он есть). iBug 6 лет назад 1
@iBug Это проще, только если ты не знаешь batch, а bash ;-) LotPings 6 лет назад 1
Мне очень нравится RegexRenamer Cole Johnson 6 лет назад 1

2 ответа на вопрос

1
LotPings

for /D /r %%f in (*) do ( недопустимая комбинация, смотрите вывод с эхом.

  • Вы можете сложить два, for /Dчтобы перебрать сначала, picsfrom..а затем подпапки или
  • for /fВыход разборе реж фильтруется с регулярным выражением ($ анкеры в конце), чтобы соответствовать только желает подпапки с Findstr:

@Echo off Set "Folders=view_pictures$ personal_pictures$ scenic_pictures$"  For /f "delims=" %%F in ( 'Dir /B/S/AD ^|Findstr /I "%Folders%"' ) Do Ren "%%~fF" "2017_%%~nxF" 

Пример дерева на моем ramdrive A:

> tree A:\ └───root path ├───picsfromA │ ├───2017_personal_pictures │ └───2017_view_pictures ├───picsfromB │ ├───2017_personal_pictures │ ├───2017_scenic_pictures │ └───2017_view_pictures ├───picsfromC │ ├───2017_personal_pictures │ └───2017_scenic_pictures ├───picsfromD │ └───2017_personal_pictures └───picsfromN └───2017_scenic_pictures 

РЕДАКТИРОВАТЬ Вывод for /D /r %%A in (*) do Echo:%%Aна моей системе

A:\root path\picsfromA A:\root path\picsfromB A:\root path\picsfromC A:\root path\picsfromD A:\root path\picsfromN A:\root path\picsfromA\2017_personal_pictures:A:\root path\picsfromN A:\root path\picsfromA\2017_view_pictures:A:\root path\picsfromN A:\root path\picsfromB\2017_personal_pictures:A:\root path\picsfromN A:\root path\picsfromB\2017_scenic_pictures:A:\root path\picsfromN A:\root path\picsfromB\2017_view_pictures:A:\root path\picsfromN A:\root path\picsfromC\2017_personal_pictures:A:\root path\picsfromN A:\root path\picsfromC\2017_scenic_pictures:A:\root path\picsfromN A:\root path\picsfromD\2017_personal_pictures:A:\root path\picsfromN A:\root path\picsfromN\2017_scenic_pictures:A:\root path\picsfromN 
Ваше решение FOR / F в порядке. Но в `FOR / D / R %% F в (*) DO ...` нет ничего плохого. Работает отлично. dbenham 6 лет назад 0
@dbenham Я получаю два пути (полный путь и корневой путь), разделенных двоеточием с помощью этой команды для подпапок, так что это может быть допустимым, но имеет неожиданные результаты. LotPings 6 лет назад 0
Я не понимаю ваше описание вывода FOR / R / D. На моей машине я получаю ожидаемый рекурсивный список полного пути каждой дочерней папки в корневом каталоге. Я успешно использовал эту конструкцию в течение многих лет. dbenham 6 лет назад 0
@dbenham Добавил к моему ответу вывод команды. LotPings 6 лет назад 0
Что, черт возьми, этот фанк @! **% ??? Я не могу представить, что вызывает этот результат на вашей машине. Я, конечно, никогда не видел ничего подобного. Я хотел бы получить лучшее понимание. Вы можете опубликовать эту проблему в качестве темы на http://www.dostips.com/forum. Это хороший сайт для совместных исследований туда и обратно. dbenham 6 лет назад 0
1
dbenham

Вот рабочее решение с использованием FOR / D / R

@echo off for /d /r %%F in (*) do ( if /i "%%~nxF" == "view_pictures" ren "%%F" "2017_%%~nxF" if /i "%%~nxF" == "personal_pictures" ren "%%F" "2017_%%~nxF" if /i "%%~nxF" == "scenic_pictures" ren "%%F" "2017_%%~nxF" ) 

Или упрощенный с дополнительной петлей

@echo off for /d /r %%F in (*) do for %%A in (view personal scenic) do ( if /i "%%~nxF" == "%%A_pictures" ren "%%F" "2017_%%~nxF" ) 

Или вы можете использовать решение FOR / F, опубликованное LotPings.

Вы также можете использовать мою утилиту переименования регулярных выражений JREN.BAT . JREN - это чистый сценарий (гибридный JScript / batch), который изначально запускается на любой машине с Windows начиная с XP - сторонний exe-файл не требуется.

jren "^" "2017_" /s /d /fm "scenic_pictures|personal_pictures|view_pictures" 
спас мой день, отличное, элегантное решение, спасибо! user648026 6 лет назад 0

Похожие вопросы