Як перейменувати купу каталогів у Windows?


2

Я хотів би змінити ім'я каталогу з

view_pictures
personal_pictures
scenic_pictures

до

2017_view_pictures
2017_personal_pictures
2017_scenic_pictures

У кожній папці є файли всередині, і це лише вигаданий приклад, у вихідному режимі є більше 20К підкаталогів, тому ручне перейменування неможливо.
Я спробував отримати список за допомогою команди дерева ,
тож я можу маніпулювати списком за допомогою блокнота ++ та деякого регексу,
але дерево не дасть повний шлях, щоб я міг генерувати команду.

Це структура каталогу:

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.]
    )

  )

1
Ви повинні подивитися на утиліту масового перейменування - - bulkrenameutility.co.uk/Main_Intro.php
Anaksunaman

1
Все було б набагато простіше, якби у вас Windows 10 (якщо він є) у вас є WSL.
iBug

1
@iBug Це простіше, якщо ти не знаєш партії, але баш ;-)
LotPings

1
Мені дуже подобається RegexRenamer
Cole Johnson

Відповіді:


1

Ось робоче рішення за допомогою 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 / пакетний), який працює на будь-якій машині Windows від XP далі - не потрібен сторонній файл EXE.

jren "^" "2017_" /s /d /fm "scenic_pictures|personal_pictures|view_pictures"

врятував мені день, чудове, елегантне рішення, дякую!
користувач648026

1

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"

Зразок дерева на моєму рейдміве 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

Вихід EDITfor /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 in (*) DO .... Це прекрасно працює.
dbenham

@dbenham Я отримую два патчі (fullpath та root шлях), розділених двокрапкою з цією командою для підпапок, тому вона може бути дійсною, але має несподівані результати.
LotPings

Я не розумію вашого опису виводу FOR / R / D. На своїй машині я отримую очікуваний рекурсивний перелік повного шляху кожної дочірньої папки під корінь. Я успішно використовую цю конструкцію роками.
dbenham

@dbenham Додав до моєї відповіді вихід команди.
LotPings

Що за чорт це фанк @! **% ??? Я не уявляю, що спричиняє цей результат на вашій машині. Я, звичайно, ніколи не бачив нічого подібного. Я хотів би краще зрозуміти. Ви можете опублікувати цю проблему як тему на dostips.com/forum . Це хороший сайт для спільних розслідувань.
dbenham
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.