CMD для итерации и рекурсивного переименования всех имен файлов и добавления текущей папки подкаталога к текущему имени файла.

Эта команда в cmd переименовывает все файлы в текущем каталоге

for /f "tokens=*" %a in ('dir /b') do ren "%a" "00_%a"

Но мне нужно получить текущее имя подкаталога (только имя папки) и добавить его в% a

Он должен пройти через все подкаталоги в папке parent.

У меня есть путь C:\Temp\Photos_ToRename со следующими папками и файлами

NVA-1234 (это имя подкаталога)
--- IMG_0999.jpg (переименовать в NVA-1234_IMG_0999.jpg)
--- IMG_0989.jpg (переименовать в NVA-1234_IMG_0989.jpg)
- - IMG_0979.jpg (переименовать в NVA-1234_IMG_0979.jpg)

NVS-3456 (это имя подкаталога)
--- IMG_1999.jpg (переименовать в NVS-3456_IMG_1999.jpg)
--- IMG_1989.jpg (переименовать в NVS-3456_IMG_1989.jpg)
--- IMG_1979.jpg (переименовать в NVS-3456_IMG_1979.jpg)

NVS-3359 (это имя подкаталога)
--- IMG_2999.jpg (переименовать в NVS-3359_IMG_2999.jpg)
--- IMG_2989.jpg (переименовать в NVS-3359_IMG_2989.jpg)
--- IMG_2979.jpg (переименовать в NVS- 3359_IMG_2979.jpg)

.....


person jussamen    schedule 17.11.2020    source источник
comment
Недавно я ответил на аналогичный вопрос здесь: stackoverflow.com/a/64601339/1024832. Он в основном сглаживает структуру каталогов, перемещая имена каталогов в имя файла, что, я думаю, именно то, что вы пытаетесь сделать. Как упоминалось в предостережениях, запускайте его только в каталоге, для которого у вас есть копия / резервная копия.   -  person Marc    schedule 17.11.2020
comment
Я изменил пакетное переименование на batch-file, потому что я думаю, что вы имели в виду именно это; если я ошибаюсь, и вы не хотите использовать командный файл, просто удалите этот тег ...   -  person aschipfl    schedule 17.11.2020
comment
В DOS нет for /f. Это команда в Windows cmd, которая совершенно другая. Не используйте DOS, когда говорите о Windows cmd   -  person phuclv    schedule 19.11.2020


Ответы (2)


Это должно сработать без манипуляций со строками и только с итерацией необходимой глубины иерархии каталогов - код для прямого использования в командной строке:

for /D %J in ("C:\Temp\Photos_ToRename\*") do @pushd "%~J" && ((for /F "delims= eol=|" %I in ('dir /B /A:-D-H-S "*.jpg"') do @ren "%I" "%~nxJ_%I") & popd)

Код для использования в пакетном файле (с комментариями):

@echo off
rem // Iterate only the required directory hierarchy depth:
for /D %%J in ("C:\Temp\Photos_ToRename\*") do (
    rem // Change into the currently iterated sub-directory:
    pushd "%%~J" && (
        rem /* Iterate through matching files; the `for /F` loop together with `dir` is
        rem    mandatory here and cannot be replaced by a simple standard `for` loop like
        rem    `for %%I in ("*.jpg") do`, because then, files might become renamed twice
        rem    since `for` does not build the complete file list prior to looping, but
        rem    `for /F` does as it awaits the full output of the `dir` command: */
        for /F "delims= eol=|" %%I in ('dir /B /A:-D-H-S "*.jpg"') do (
            rem // Actually rename the currently iterated file:
            ren "%%I" "%%~nxJ_%%I"
        )
        rem // Return from sub-directory:
        popd
    )
)
person aschipfl    schedule 17.11.2020

Я думаю, это должно помочь:

@echo off
set root=%~dp0
for /f "tokens=*" %%a in ('dir /b /s') do call :process "%%a"
exit /b

:process
set fullfolder=%~dp1
call set folder=%%fullfolder:%root%=%%
if not %folder%x==x call set folder=%%folder:\=_%%
set newfile=%folder%%~nx1
ren %1 %newfile%

Это сохраняет каждый файл в его текущей папке, но переименовывает его в folder_subfolder_filename.

Мне пришлось добавить это if, потому что в противном случае с пустой переменной папки он назначил ей \=_.

Сначала я сохраняю текущий путь, чтобы удалить его из полного пути к каждому файлу, а затем добавляю относительный путь к имени.

person Andrew    schedule 17.11.2020