[bash] 명령행 인자($1)를 cut으로 분리해서 처리하는 기법 (delimiter : '.')
bash에서 명령행 인자로 $1을 받아, 그 문자열을 가공해서 명령을 처리하는 하나의 방식.
awk나 sed를 사용해도 처리할 수 있지만 cut을 간단히 사용할 수도 있다.
가령 "maps.google.com"이라는 문자열이 있다면, 거기서 "maps.google"과 "com"을 변수에 담아서 사용해보자.
# 구분자를 '.'로 사용해서 첫번째 단어를 추출하는 방법
$ echo "maps.google.com" | cut -d '.' -f 1
maps
$ 두 번째 단어부터 끝까지 추출하는 방법
$ echo "maps.google.com" | cut -d '.' -f 2-
google.com
하지만 끝 단어 'com'만 뽑아내는 옵션이 없다. 보통 파일 확장자가 마지막에 오기 때문에 이것이 중요하다.
이럴 때 'rev'이라는 명령어가 있는데 문자열을 뒤집어주는 것이다. 누군가가 머리 굴린 결과를 보고 조금 감탄했다. ㅋㅋ
$ echo "maps.google.com" | rev | cut -d'.' -f 1 | rev
com
rev이 한글도 뒤집어준다.
그럼 com을 제외한 앞부분 문자열은 어떻게 구할까?
$ echo "maps.google.com" | rev | cut -d'.' -f 2- | rev
maps.google
아래는 간단한 테스트 코드다.
# 테스트 문자열
IN="test_1.girl.mp4"
# 확장자 구하기 : 'mp4'
EXT=$(echo $IN | rev | cut -d'.' -f 1 | rev)
# 확장자 제외한 파일명 구하기: 'test_1.girl'
PREFIX=$(echo $IN | rev | cut -d'.' -f 2- | rev)
echo $EXT
echo $PREFIX
이제 이것을 실전에서 사용하는 예제를 만들어본다. ffmpeg로 동영상을 회전시켜 파일로 저장하는 기능을 좀더 편하게 bash 쉘 스크립트로 짠 것인데, ffmpeg 기본 사용 명령은 이렇다.
$ ffmpeg -i in.mp4 -vf "transpose=2" out.mp4
아래 스크립트에 실행 권한을 줘서,
$ mpeg test_1.girl.mp4
하는 식으로 실행하면 ffmpeg를 사용해
test_1.girl_rotated.mp4
라는, 회전한 동영상을 만들어준다.
#!/bin/bash
# 파일명: mpeg
# 사용법: mpeg [변환할동영상]
# 동영상을 ffmpeg로 회전시키는 프로그램
# 첫번째 인자로 변환할 동영상 파일 지정
# original.mp4 => original_rotated.mp4
# 인자로 주어진 파일 찾아서 없으면 에러.
# IN="test_1.girl.mp4"
if [ ! -f $1 ]; then
echo "$1 : not exist."
exit
fi
IN=$1
# 확장자 구하기 : 가령 'mp4'
EXT=$(echo $IN | rev | cut -d'.' -f 1 | rev)
# 확장자 제외한 파일명 구하기: 가령 'test_1.girl'
PREFIX=$(echo $IN | rev | cut -d'.' -f 2- | rev)
# echo $EXT
# echo $PREFIX
# ffmpeg : transpose 값
# 0 = 90도를 시계 반대 방향으로 돌리고 상하 반전 시킨다.(기본값)
# 1 = 90도를 시계 방향으로 돌린다.
# 2 = 90도를 시계 반대 방향으로 돌린다.
# 3 = 90도를 시계 방향으로 돌리고 상하 반전 시킨다.
ffmpeg -i $IN -vf "transpose=2" $PREFIX"_rotated".$EXT
# echo $PREFIX"_rotated".$EXT
# 아래 명령을 참고했음. 구분자 '.'로 나눈 마지막 단어를 구하는 방법
# echo "maps.google.com" | rev | cut -d'.' -f 1 | rev