Windows CMD-как переименовать все файлы во всех подпапках в имя родительской папки

хорошо скриптерам,

Я все еще пытаюсь обернуть голову вокруг команды FOR. Что Id нравится делать, так это переименовать все файлы во всех подпапках в имя папки, в которой они находятся, сохраняя их расширения. Id представьте, что это можно сделать с чем-то вроде:

   For /R %X in (*.*) do REN %X <argument for parent folder name>

может быть, я ошибаюсь. Как правильно это сделать? И это должен быть сценарий. Я не спрашиваю о утилите массового переименования или переименования файлов Deluxe и т. д.

Спасибо за ваше время!

30
задан Heatseeker86
15.01.2023 5:24 Количество просмотров материала 3523
Распечатать страницу

2 ответа

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

но перед каждым файлом можно вставить имя родительской папки-что-то вроде

"fileName.ext" --> "parentFolderName_fileName.ext"

FOR /R команда может перебирать пути к папкам всех папок в корневом дереве.

DIR /B /A-D "folderPath" команда может перечислить все файлы внутри папки. Но вы не хотите переименовывать файлы, которые начинаются с имени родительской папки, чтобы их можно было передать в FINDSTR для исключения уже переименованных файлов.

результаты передаваемой по конвейеру команды можно повторить с помощью 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.ЛЕТУЧАЯ МЫШЬ утилита переименования регулярных выражений. Это чистый скрипт (hybrid batch / JScript), который изначально работает на любой машине Windows, начиная с XP. Нет 3rd party exe файлы не нужны.

полная документация встроена в утилиту-Access via jren /? или jren /?? если вы хотите постраничный вывод.

следующая простая команда обработает дерево, коренящееся в текущем каталоге:

for /r %F in (.) do @call jren "^" "%~nxF_" /p "%F" /fx "%~nxF_*"

первые два аргумента JREN являются find / replace строки-поиск соответствует началу имени файла, а замена просто вставляет имя родительской папки (с конечным подчеркиванием). The /P "%F" параметр указывает корневую папку. А то /FX "%~nxF_* опция исключает файлы, которые уже начинаются с имени родительской папки, с последующим подчеркиванием.

команда может быть помещена в пакетный скрипт, который принимает необязательную корневую папку в качестве аргумента (обработать текущий каталог, если значение не указано):

@echo off
for /r %1 %%F in (.) do call jren "^" "%%~nxF_" /p "%%F" /fx "%%~nxF_*"
1
отвечен dbenham 2023-01-16 13:12

Сохранить как *.bat

@echo off
for /r %%D in (.) do (
  for /f "delims=" %%F in ('dir /b /A:-D "%%D"') do echo "%%D\%%F" "%%~nxD%%~xF"
)
@echo off
for /r %%F in (*) do (
  for /f "delims=" %%D in ("%%~dpF.") do echo "%%F" "%%~nxD%%~xF"
)

убедитесь, что это то, что вы хотите перед заменой echo С ren.

ссылки:

для циклических команд

Расширения Параметр

0
отвечен guest-vm 2023-01-16 15:29

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх