Вы можете достичь поставленной цели только в том случае, если в каждой папке никогда не содержится более одного файла любого типа. Это не разумное ожидание, если нет необычных обстоятельств.
Но перед каждым файлом можно вставить имя родительской папки - что-то вроде
"fileName.ext" --> "parentFolderName_fileName.ext"
Команда FOR /R
может повторять пути к папкам всех папок в корневом дереве.
Команда DIR /B /A-D "folderPath"
может перечислить все файлы в папке. Но вы не хотите переименовывать файлы, которые уже начинаются с имени родительской папки, поэтому их можно отправить в FINDSTR, чтобы исключить уже переименованные файлы.
Результаты команды piped могут быть повторены с FOR /F. Параметры EOL и DELIMS используются для обеспечения сохранения полного имени каждого файла.
%%~nxD
возвращает только имя папки и расширение родительской папки.
Собрав все это вместе, следующий длинный вкладыш можно использовать непосредственно в командной строке. Это обработает дерево с корнем в текущем каталоге.
for /r %D in (.) do @for /f "eol=: delims=" %F in ('dir /b /a-d "%D" 2^>nul^|findstr /vbic:"%~nxD_"') do ren "%D\%F" "%~nxD_%F"
Команду можно поместить в скрипт, а затем в качестве аргумента можно передать корневую папку для обработки. Если аргумент не указан, скрипт обрабатывает, начиная с текущего каталога. Если указан аргумент, то это значение используется в качестве корневой папки.
@for /r %1 %%D in (.) do @for /f "eol=: delims=" %%F in (
'dir /b /a-d "%%D" 2^>nul^|findstr /vbic:"%%~nxD_"'
) do ren "%%D\%%F" "%%~nxD_%%F"
Код проще, если вы используете мою утилиту переименования регулярных выражений JREN.BAT. Это чистый скрипт (гибридный пакет /JScript), который работает на любом компьютере с Windows начиная с XP. Не требуются сторонние exe-файлы.
Полная документация встроена в утилиту, доступ к которой осуществляется через jren /?
или jren /??
если вы хотите постраничный вывод.
Следующая простая команда обработает дерево с корнем в текущем каталоге:
for /r %F in (.) do @call jren "^" "%~nxF_" /p "%F" /fx "%~nxF_*"
Первые два аргумента JREN - это строки поиска / замены - поиск соответствует началу имени файла, а замена просто вставляет имя родительской папки (с завершающим подчеркиванием). Параметр /P "%F"
указывает корневую папку. А параметр /FX "%~nxF_*
исключает файлы, которые уже начинаются с имени родительской папки, за которым следует подчеркивание.
Команду можно поместить в пакетный скрипт, который принимает необязательную корневую папку в качестве аргумента (обрабатывает текущий каталог, если не указано значение):
@echo off
for /r %1 %%F in (.) do call jren "^" "%%~nxF_" /p "%%F" /fx "%%~nxF_*"