내 음악 m4a, mp3 등을 더 잘 정리하려고 노력 중입니다. 파일에 태그가 지정되어 있으므로 파일을 읽고 파일에서 앨범 및 아티스트 정보를 추출한 다음 파일을 올바른 폴더에 mv하는 스크립트를 작성할 수 있다고 생각했습니다. 나는 또한 그 과정에서 AWK를 배우고 싶습니다.
나는 다음과 같이 시작했습니다:
for file in *.m4a; do
tageditor get artist -f "$file" | awk '/Artist/{ print }'
done
산출:
Artist Periphery
Artist Meshuggah, Tomas Haake, Marten Hagström, Fredrik Thordendal,
Artist Varials, Bryan Garris
Artist Cannibal Corpse
Artist Lamb of God
Artist Ingested
Artist Linkin Park
Artist Car Bomb
Artist Whitechapel
Artist Divine Destruction
Artist Ingested, Sean Hynes, Sam Yates, Jason Evans, Lyn Jeffs
그 다음에:
for file in *.m4a; do
tageditor get artist -f "$file" | awk '/Artist/{ print $2 }'
done
산출:
Periphery
Angelmaker,
Meshuggah,
Varials,
Cannibal
Lamb
Ingested
Linkin
Car
Whitechapel
Divine
Ingested,
나는 여전히 awk가 어떻게 작동하는지 이해하려고 노력 중이어서 코드를 다시 작성했습니다.
./*.m4a에 있는 파일의 경우 info=$(tageditor get 아티스트 앨범 -f "${file}") prt1=$(echo "$info" | awk 'sub(/^.{22}/, " ")') prt2=$(echo "$prt1" | awk 'NR>2' ) art="$prt2" albm=$(echo "$prt2" | awk 'NR==1' ) band=$( echo "$art" | awk 'NR= =2' ) 에코 "$info" 에코 에코 "$prt1" 에코 에코 "$prt2" 에코 에코 "$albm" #ALBUM 에코 에코 "$band" #ARTIST 에코
나는 다음을 얻습니다: "./Do Not Look Down.m4a"에 대한 태그 정보:
- MP4/iTunes 레이블 앨범 Koloss 아티스트 Meshuggah, Tomas Haake, Marten Hagström, Fredrik Thordendal, Tomas Haake
/아래를 내려다보지 마세요.m4a": [0m Koloss Meshuggah, Tomas Haake, Marten Hagström, Fredrik Thordendal, Tomas Haake
코로스 메소우가, 토마스 해커, 마틴 하그스트롬, 프레데릭 토덴달, 토마스 해커
콜로스
Meshuggah, Thomas Haacke, Martin Hagström, Fredrik Todendaal, Thomas Haacke
awk를 사용하여 마지막 줄과 그 뒤의 모든 줄을 삭제하는 방법
답변1
내보내기 도구셸 명령줄이나 셸 스크립트에서 원하는 작업(메타데이터를 기반으로 파일 이동 및 이름 바꾸기 포함)을 수행할 수 있는 명령줄 도구(Perl로 작성)입니다.
이름에 있는 "EXIF"에 속지 마십시오. EXIF 데이터뿐만 아니라 이미지, 오디오 및 비디오 형식에서 문서(예: DOCX 및 Microsoft Office 형식)에 이르기까지 다양한 파일 형식에 대한 메타데이터를 읽고 쓸 수 있습니다. ) xls, 오픈 오피스 형식, PDF 등
자세한 내용은 매뉴얼 페이지를 참조하십시오.
를 사용하는 대신 직접 작성하고 싶다면 exiftool
다음 내용을 계속 읽으세요.
perl
다양한 파일 형식의 메타데이터를 읽고 쓸 수 있는 여러 라이브러리 모듈이 있으므로 이와 같은 작업 에 권장합니다 .
이미지::Exif 도구이런 도서관이군요. exiftool
이 프로그램은 자신만의 전문 도구를 작성하려는 사람들과 프로그램을 지원하기 위해 개발되었으며 지금도 개발되고 있습니다 .
Debian을 사용하는 경우 Image::Exiftool
이는 작동합니다 exiftool
. sudo apt-get install libimage-exiftool-perl
다른 배포판용으로 패키지되어 있는 것이 거의 확실합니다(예: 패키지 이름이 Centos perl-Image-ExifTool
).
Image::Exiftool
다양한 유형의 파일을 처리할 수 있기 때문에(배우는 데 드는 노력을 최대한 활용할 수 있기 때문에) 이것을 권장하지만 , 이것이 유일한 Perl 라이브러리는 아닙니다. 그 외 다수가 있습니다.MP4::정보그리고오디오::스캔. 이 두 가지는 debian libmp4-info-perl
에 패키지되어 있습니다 libaudio-scan-perl
.
Perl은 또한 디렉토리를 생성하고 파일 이름을 바꾸는 등의 작업을 수행할 수 있으며 셸과 달리 파일 이름과 변수의 따옴표, 공백 또는 셸 메타 문자와 관련된 문제가 없습니다. 쉘 및 awk 코드에서 이러한 문제 중 일부는 이미 발생했으며 이는 미디어 파일에서 흔히 발생하는 긴 파일 이름과 메타데이터에서 발생하는 심각한 문제입니다. 이것은많은perl
셸이나 에서 작성하는 것보다 쉽고 awk
셸 이외의 다른 언어로 작성하는 것이 오류가 발생할 가능성도 적습니다.
perl
는 awk
UNIX 환경의 일부로 작성되었습니다. 이는 종종 "스위스군 전기톱"이라고도 하며 모든 일반적인 UNIX 도구( grep
, sed
, tr
, awk
등 cut
)의 기능을 하나의 언어로 결합합니다.
Perl은 C와 유사한 구문에 대한 기본적인 이해가 있으면 배우기 쉽고 절차적 프로그래밍 스타일과 선택적인 객체 지향 프로그래밍 스타일이 혼합되어 있습니다. 지금 Perl을 배우세요Perl에 대한 많은 정보와 가장 중요한 Perl 관련 사이트에 대한 링크가 있는 좋은 출발점입니다. 그들의"Perl 초보자" 온라인 튜토리얼매우 좋은.
Perl에서 배우는 대부분의 내용은 awk
(awk의 "CONDITION {ACTION}" 규칙 스타일의 맥락에서 언어도 C와 유사합니다.) 및 grep
( sed
sed에서와 마찬가지로 정규식은 + 및 -와 같은 Perl 연산자에 있습니다. 함수 호출 s/search/replace/
및 re.sub(search,replace,string)
기타 Unix 도구 대신 .
Python에는 파일의 메타데이터를 처리하기 위한 라이브러리 모듈도 있으므로 좋은 선택이지만, 제 생각에는 명령줄 "도구"보다 "응용 프로그램"을 작성하는 데 더 적합합니다. 객체 지향 프로그래밍 스타일은 거의 필수이며 (Fortran을 제외한 거의 모든 다른 언어와 달리) 공백과 들여쓰기는 유연하지도 않고 구문적으로 중요하지도 않습니다(즉, 들여쓰기가 잘못된 경우 코드 동작이 다양하여 특정 유형의 오류가 발생할 수 있습니다) 감지하기 어렵습니다). 일반적인 프로그래밍 원칙과 실습 외에도 Python에서 배운 내용은 다른 UNIX 도구에서 즉시 재사용할 수 없습니다.
답변2
sub()
함수를 사용하여 각 줄의 시작 부분에서 원하지 않는 부분을 제거할 수 있습니다 .
for file in ./*.m4a; do
tageditor get artist -f "$file" | awk 'sub(/^Artist */, "")'
done
또한 명령의 출력이 tageditor
탭으로 구분되어 있다고 생각했습니다. 그렇다면 awk의 기본 공백(탭/SPC) 구분 기호를 탭으로 제한한 다음 두 번째 열을 인쇄할 수 있습니다.
for file in ./*.m4a; do
tageditor get artist -f "$file" | awk -F'\t' '/^Artist/{ print $2 }'
done
tageditor
또한 이 명령은 자체적으로 여러 파일을 읽을 수 있으므로 다음 작업도 수행할 수 있다는 것을 알았습니다 .
tageditor get artist -f /path/to/*.m4a | awk -F'\t' '/^Artist/{ print $2 }'
답변3
이것이 당신이 원하는 것입니까( cat file
없는 곳을 대체)?tageditor...
$ cat file | awk 'sub(/^Artist[[:space:]]+/,""){sub(/,.*/,""); print}'
Periphery
Meshuggah
Varials
Cannibal Corpse
Lamb of God
Ingested
Linkin Park
Car Bomb
Whitechapel
Divine Destruction
Ingested
문자열의 처음 /Artist/
뿐만 아니라 줄의 어느 곳에서나 일치하므로 unanchored를 사용하지 마세요 .Artist
$ printf 'Foo\tBob The Artist\nArtist\tLamb of God\nArtistically\tIs how we do it\n'
Foo Bob The Artist
Artist Lamb of God
Artistically Is how we do it
$ printf 'Foo\tBob The Artist\nArtist\tLamb of God\nArtistically\tIs how we do it\n' |
awk '/Artist/'
Foo Bob The Artist
Artist Lamb of God
Artistically Is how we do it
$ printf 'Foo\tBob The Artist\nArtist\tLamb of God\nArtistically\tIs how we do it\n' |
awk '/^Artist[[:space:]]/'
Artist Lamb of God
답변4
열 1을 제외할 수 있습니다.
for file in *.m4a; do
tageditor get artist -f "$file" | awk '/Artist/{$1=""}1'
done