나는 음악을 재생하는 스크립트를 작성했습니다. 그런데 파일 이름이 이상하네요.
이 파일 이름 문자열이 있다고 가정해 보세요.
Muzzy__Break_Away__28feat._Priority_One_29__5BMonstercat_EP_Release_5D.mp3
나는 이 목표를 달성하고 싶다.
Muzzy Break Away feat Priority One
지금까지 나는 이것을 bash에 가지고 있습니다.
file="whatever";
file=${file//_/" "};
file=${file//[0123456789ABCDEF][0123456789ABCDEF]/""}; #replaces bytes
file=${file//.extension1/""};
file=${file//.extension2/""};
file=${file//.extensionn/""}; #many more, e.g. .mp3
file=${file//word1/""};
file=${file//word2/""};
file=${file//wordn/""}; #many more, e.g. Monstrcat
file=${file//./""};
echo "$file";
1개의 명령으로 동일한 순서(대소문자 구분)로 이를 단순화하는 방법이 있습니까?
답변1
Perl을 호출할 수도 있습니다:
formatted=$( perl -lpe '
s/([0-9A-F]{2})/chr hex $1/eg; # hex to ascii
s/_+/ /g; # underscores to space
s/\[[^]]*\]//g; # remove bracketed text
s/[^[:alnum:][:blank:]]//g; # remove non-alphanumeric,non-blank chars
' <<<"${file%.*}"
)
echo "$formatted"
Muzzy Break Away feat Priority One
답변2
이는 _28
특정 문자의 16진수 인코딩처럼 보입니다. 어쩌면 다음과 같은 것을 원할 수도 있습니다( zsh
대신 사용됨 bash
):
$ autoload zmv
$ zmv -n '*.mp3' '${${f//(#b)_([0-9A-F](#c2))/${(#)$((0x$match))}}//_/ }'
mv -- Muzzy__Break_Away__28feat._Priority_One_29__5BMonstercat_EP_Release_5D.mp3 Muzzy\ \ Break\ Away\ \(feat.\ Priority\ One\)\ \[Monstercat\ EP\ Release\].mp3
이름 바꾸기에 중점을 둔 경우:
Muzzy__Break_Away__28feat._Priority_One_29__5BMonstercat_EP_Release_5D.mp3
도착하다
Muzzy Break Away (feat. Priority One) [Monstercat EP Release].mp3
( -n
만족스러우면 제거하세요(모의 실행의 경우)).
파일 이름이 있고 $file
원하는 경우더 나은표시 표현의 경우 다음을 사용합니다.
set -o extendedglob # (that's on by default in zmv)
display=${${${file//(#b)_([0-9A-F](#c2))/${(#)$((0x$match))}}//_/ }:r}
(#b)
역참조 활성화(따라서$match[1]
패턴에 캡처된 첫 번째 문자열이 대체됩니다)${(#)var}
의 내용을$var
숫자로 해석하고 해당 코드 포인트가 있는 문자로 확장합니다.$var:r
$var
에서 파일 이름의 루트 이름을 가져옵니다(확장자 제거).
답변3
이 작업을 수행하기 위해 bash 검색/대체를 사용해서는 안 됩니다. 파일에 ID3 메타데이터가 있는 경우 거기에서 해당 메타데이터를 읽고 선호하는 템플릿과 함께 사용해야 합니다.
$ id3v2 -l file.mp3
Title : Computer Love Artist: Zapp
Album : Golden Gems-80s Year: 2017, Genre: Pop (13)
Comment: Track: 29
id3v2 tag info for 29-zapp-computer_love-f3b5b5db.mp3:
TRCK (Track number/Position in set): 29/29
TPE1 (Lead performer(s)/Soloist(s)): Zapp
TIT2 (Title/songname/content description): Computer Love
TCON (Content type): Pop (13)
TALB (Album/Movie/Show title): Golden Gems-80s
TYER (Year): 2017
그런 다음 awk/sed/cut/grep과 같은 도구를 사용하여 다음과 같은 변수에 정보를 저장할 수 있습니다.
Artist=$(id3v2 -l file.mp3 | grep "TPE" | awk -F: '{print $2}')
Title=$( id3v2 -l file.mp3 | grep "TIT2" | awk -F: '{print $2}')
mv file.mp3 "${Artist} - ${Title}.mp3"
하지만 다음과 같은 도구를 사용하는 것이 좋습니다.MP3 태그/뮤직 브레인 피커드음악 파일을 관리하기 위해 실시간 미리보기를 제공하고 실수할 경우 롤백할 수 있습니다.
답변4
sed
다음 명령을 사용하여 원하는 출력을 얻었습니다 .
echo "Muzzy__Break_Away__28feat._Priority_One_29__5BMonstercat_EP_Release_5D.mp3" \
| sed "s/_[0-9]\{2\}_.*//g" | sed "s/[_0-9\.]/ /g"| sed -r "s/\s+/ /g"
산출
Muzzy Break Away feat Priority One