내 음악 라이브러리에 다음 형식의 노래 제목이 포함된 편집 앨범이 있는데 슬래시로 인해 이러한 파일을 만들기 ARTIST/ TITLE
가 어렵습니다 . 그래서 저는 이 파일들의 이름을 변경하여 관리하기 쉽게 만들고 싶었습니다 (또한 내 음악 라이브러리의 나머지 이름과 일관되게 이름을 지정하고 싶었습니다). 이것이 내가 지금까지 가지고 있는 것입니다:cp
mv
Title (Artist)
#! /bin/bash
for i in ./*.flac; do
TITLE=`ls "$i" | sed #display string after backslash`
ARTIST=`ls "$i" | sed #display string before backslash`
mv ./"$i" ./"$TITLE ($ARTIST)"
done
또한 슬래시 뒤에 공백이 있어서 상황이 ARTIST/ TITLE
엉망이 될 수도 있다는 점을 기억하세요.
답변1
귀하의 질문은 다음과 같습니다.
문자열을 포함하는 bash 변수가 있습니다. 문자열 앞과 뒤의 두 부분으로 나누고 싶습니다 "/ "
.
그렇다면 간단한 bash 솔루션은 다음과 같습니다.
track="Judy Garland/ Somewhere Over the Rainbow"
title="${track#*/ }"
artist="${track%%/ *}"
문법은 #
"...와 일치하는 가장 짧은 접두사가 없습니다"를 의미합니다. 문법은 %%
"일치하는 가장 긴 접미사가 없습니다..."를 의미합니다. (마찬가지로 ##
접두사는 가장 길고 접미사는 가장 짧아야 합니다 %
.) 패턴은 일반 bash glob( shopt -s extglob
또는 유효한 경우 확장 bash glob)입니다. 이것은아니요정규식.
패턴이 일치하지 않으면 문자열은 수정되지 않은 상태로 반환되며 특히 슬래시 뒤에 공백이 있는지 확실하지 않은 경우 해당 조건을 확인해야 합니다.
그런데 왜 을 사용합니까 ls "$i"
? 물론 이는 또는 "here-string"을 $i
사용할 수도 있는 값과 다르지 않습니다.echo
sed '# some sed magic' <<<"$i"