Как найти и заменить часть имен файлов из списка - PullRequest
1 голос
/ 26 апреля 2019

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

Пример:

BL_1402B103_abc.wav > BL_C1234-1_abc.wav

BL_15489B59_abc.wav > BL_C1234-5_abc.wav

Итак, в первом примере выше я хочу заменить 1402B103 на C1234-1, все файлы имеют одинаковую длину, а разделы, которые я хочу заменить, разделены "_".

У меня есть некоторый код для поиска / замены частей имени файла, но мне нужно сделать это для сотен файлов - есть ли способ извлечь Pattern = & Replace = как переменные из csv / list и запустить как пакет?

Setlocal enabledelayedexpansion

Set "Pattern=1402B103"
Set "Replace=C1234-1"

For %%f in (*.wav) Do (
    Set "File=%%~f"
    Ren "%%f" "!File:%Pattern%=%Replace%!"
)

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

Я бы выполнил такую ​​операцию многократного переименования файлов, используя условно-бесплатное программное обеспечение Total Commander со встроенным инструментом многократного переименования, который имеет простой в использовании графический интерфейс пользователя для таких задач, позволяющий просматривать новые именафайлы перед выполнением операции переименования.Эту операцию переименования файлов можно выполнить, когда Total Commander практически завершен, используя всего несколько щелчков мышью, просто наберите C1234- на клавиатуре.А Total Commander поддерживает даже отмену, если по какой-либо причине операция переименования не удалась.

Допустим, C1234- в новом имени файла - это фиксированная последовательность символов, а 1 и 5 - увеличенное числопо одному на каждый переименованный файл.

@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "FileNumber=1"
for /F "eol=| delims=" %%I in ('dir BL_????????_abc.wav /A-D-H /B /ON 2^>nul') do (
    move /Y "%%I" "BL_C1234-!FileNumber!_abc%%~xI" >nul
    set /A FileNumber+=1
)
endlocal

Это решение работает для примера.

Но что касается строки слева до первого подчеркивания и строки справа до второго подчеркивания, зависит от имени файла к файлуname?

В этом случае следующий пакетный файл может быть правильным решением:

@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "FileNumber=1"
for /F "eol=| delims=" %%I in ('dir *_????????_*.wav /A-D-H /B /ON 2^>nul') do (
    for /F "eol=| tokens=1,2* delims=_" %%A in ("%%~nxI") do (
        move /Y "%%I" "%%A_C1234-!FileNumber!_%%C" >nul
    )
    set /A FileNumber+=1
)
endlocal

Команда MOVE с параметром /Y используется вместо команды REN , чтобы переименовать файл, даже если файл с таким именем уже существует.Total Commander сообщит пользователю о такой проблеме при переименовании файлов с другими файлами с уже существующим новым именем.

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

  • dir /?
  • echo /?
  • endlocal /?
  • for /?
  • move /?
  • set /?
  • setlocal /?

Прочтите статью Microsoft о Использование операторов перенаправления команд для объяснения 2>nul.Оператор перенаправления > должен быть экранирован с помощью символа вставки ^ в командной строке FOR , чтобы интерпретироваться как литеральный символ, когда интерпретатор команд Windows обрабатывает эту командную строку перед выполнением команды FOR , котораявыполняет встроенную командную строку dir в отдельном командном процессе, запущенном в фоновом режиме.

0 голосов
/ 26 апреля 2019

Вы можете создать файл csv и добавить строки поиска / замены:

myfile.csv

1402B103,C1234-1
15489B59,C1234-5
etc,etc

Пакетный файл, myrename.cmd

@echo off
setlocal enabledelayedexpansion
for /f "tokens=1,* delims=," %%i in (myfile.csv) do (
    set "search=%%i"
    set "replace=%%j"
    call :fix
)
exit /b
:fix
    for %%a in (*!search!*.wav) do (
        set "file=%%a"
        set "file=!file:%search%=%replace%!!"
        echo ren "%%~fa" "!file!" 
)

Он будет искать для каждой строки в файле csv, разделенных запятыми, назначая первую метапеременную переменной search, а вторую * replaceпеременная.Затем мы просто выполняем замену каждого, вызывая эту процедуру.

Примечание !! В этом случае я использовал echo до ren для результатов тестирования.Только после того, как вы довольны своими результатами, вы должны удалить echo, чтобы выполнить фактическую команду.

...