Можно ли найти строку и заменить ее другой строкой в ​​теге заголовка нескольких mp3-файлов?

Вы можете сначала скопировать все xxx_*файлы, а затем использовать perl renameдля их переименования:

rename "s,^xxx,"$(basename $(pwd))"," *
1
20.09.2020, 14:39
1 ответ

Вы можете сделать это с помощью инструмента id3v2, который должен находиться в репозиториях вашей операционной системы (обратите внимание, что это решение предполагает использование GNU grepпо умолчанию, если вы используете Linux):

## Iterate over all file/dir names ending in mp3
for file in /path/to/dir/with/mp3/files/*mp3; do 
    ## read the title and save in the variable $title
    title=$(id3v2 -l "$file" | grep -oP '^(Title\s*|TIT2\s*.*\)):\K(.*?)(?=Artist:)'); 
    ## check if this title matches ytversion
    if [[ "$title" =~ "ytversion" ]]; then 
        ## If it does, replace ytversion with mqversion and 
        ## save in the new variable $newTitle
        newTitle=$(sed 's/ytversion/mqversion/g' <<<"$title") 
        ## Set the tite tag for this file to the value in $newTitle
        id3v2 -t "$newTitle" "$file" 
    fi
done

Это немного сложно, потому что инструмент id3v2печатает название и исполнителя в одной строке:

$ id3v2 -l foo.mp3 
id3v1 tag info for foo.mp3:
Title  : : title with mqversion string   Artist:                               
Album  :                                 Year:    , Genre: Unknown (255)
Comment:                                 Track: 0
id3v2 tag info for foo.mp3:
TENC (Encoded by): iTunes v7.0
TIT2 (Title/songname/content description): : title with mqversion string     

Флаг -oуказывает grepпечатать только совпадающую часть строки, а -Pвключает регулярные выражения PCRE. Регулярное выражение ищет либо строку, начинающуюся с Title, за которой следует 0 или более пробельных символов, а затем :(^Title\s*:), либо строку, начинающуюся с TIT2,а затем имея):(^TIT2\s*.*\)). Все, что соответствует этому моменту, затем отбрасывается \K. затем он ищет самую короткую строку символов (.*?), за которой следует Artist:.((?=Artist:); это называется положительным просмотром вперед и соответствует строке, которую вы ищете, без учета ее совпадения, поэтому она не печатаетсяgrep).

0
18.03.2021, 23:03

Теги

Похожие вопросы