Вы можете сначала скопировать все xxx_*
файлы, а затем использовать perl rename
для их переименования:
rename "s,^xxx,"$(basename $(pwd))"," *
Вы можете сделать это с помощью инструмента 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
).