Как изменить расширение с en.srt на .srt в командной строке - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть список en.srt файлов в моей папке. Мне нужно конвертировать их в .srt расширение.

Например Криминальный разум - 1x01 - Extreme Aggressor. en .srt в Криминальный разум - 1x01 - Extreme Aggressor.srt

Попробовал приведенную ниже команду, и она не сработала,

ren *.en.srt *.srt

Переименование расширения как ren *.srt *.srv работает. ( Изменение расширений всех файлов в папке с помощью одной команды на Windows)

Хотите знать, есть ли обходной путь для этого?

Ответы [ 3 ]

2 голосов
/ 29 апреля 2020

Простой, но неуклюжий метод - переименовать файлы дважды - сначала удалите .srt, затем измените .en на .srt (учитывая, что других файлов *.en) нет:

ren "*.en.srt" "*." & ren "*.en" "*.srt"

Более элегантным решением является решение, предоставленное пользователем Mofi в его комментарии :

@for /F "eol=| delims=" %I in ('dir "*.en.srt" /B /A:-D 2^> nul') do @for %J in ("%~nI") do @ren "%~I" "%~nJ%~xI"

В этот код будет выглядеть примерно так (обратите внимание на обязательные удвоенные % -сигналы):

@echo off
rem // Loop through all matching files:
for /F "eol=| delims=" %%I in ('dir "*.en.srt" /B /A:-D 2^> nul') do (
    rem /* There are `~`-modifiers for `for` meta-variables that allow to split file names:
    rem    `~n` returns the base name, so the (last) extension becomes removed;
    rem    `~x` returns the extension (including the leading `.`);
    rem    therefore, `%%~nI` is the original file name with `.srt` removed, hence
    rem    ending with `.en`, and `%%~xI` is the original extension `.srt`;
    rem    another loop is used to also split off `.en` from `%%~nI`: */
    for %%J in ("%%~nI") do (
        rem /* Now `%%~J` returned the same as `%%~nI`, but `%%~nJ` removes `.en`;
        rem    so finally, rename the file to `%%~nJ` plus the original extension `.srt`: */
        ren "%%~I" "%%~nJ%%~xI"
    )
)

После полного потока Как команда Windows RENAME интерпретирует подстановочные знаки ? на Суперпользователь , я обнаружил, что есть способ с помощью одной команды ren:

ren "*.en.srt" "?????????????????????????????????????????.srt"

Однако вам нужно убедиться, что достаточно ?, а именно столько символов, сколько есть в имени файла с самым длинным соответствием без .en.srt; в противном случае имена файлов становятся усеченными. Вы можете избежать усечения, заменив ту же последовательность ? вместо *, поэтому более длинные имена файлов вообще не переименовываются:

ren "?????????????????????????????????????????.en.srt" "?????????????????????????????????????????.srt"

В любом случае, это работает только тогда, когда исходные имена файлов не содержать больше . кроме двух в .en.srt; в противном случае все, что находится за первым ., удаляется и (наконец, заменяется srt).

1 голос
/ 28 апреля 2020

Не сложно в PowerShell идентифицировать файлы и заменить конец имени файла регулярным выражением. Если вы уверены, что файлы будут переименованы правильно, удалите -WhatIf из команды Move-Item.

powershell -NoLogo -NoProfile -Command ^
    "Get-ChildItem -File -Path '.' -Filter '*.en.srt' |" ^
    "ForEach-Object {" ^
        "Move-Item -Path $_.FullName -Destination $($_.FullName -replace 'en.srt$','srt') -WhatIf" ^
    "}"

Конечно, было бы проще, если бы командная оболочка была PowerShell. Кстати, этот точно такой же код будет работать на Linux и Ma c без изменений.

Get-ChildItem -File -Path '.' -Filter '*.en.srt' |
    ForEach-Object {
        Move-Item -Path $_.FullName -Destination $($_.FullName -replace 'en.srt$','srt') -WhatIf
    }
0 голосов
/ 28 апреля 2020

У меня нет cmd в моем распоряжении, но я бы предположил, что

ren *.en.srt *.tmp
ren *.tmp *.srt

работает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...