Update 2020년 12월 7일
원본 링크: Rename files in linux / bash using mv command without typing the full name two times
재밌어 보이기도 하고, 또 오랜만에 shell script 를 만져보고 싶어서 내 개발 환경에 맞게 변환하는 작업을 간단히 기록한다(나는 fish shell 을 사용한다).
function mv()
⇒ function mv
bash 와 fish 문법이 살짝 다르다.
if [ "$#" -ne 1 ] || [ ! -f "$1" ]; then
if A or B
라는 뜻이다. 이때 A
는 "$#" -ne 1
이다. $#
는 number of arguments
를 뜻한다. -ne
는 not equal
을 이므로, 곧 if A
는 'number of arguments is not equal to 1'이라는 뜻이다. A
를 fish 에서는 이렇게 표현한다. test (count $argv) -ne 1
B
는 'first argument($1
) is not(!
) file(-f
)'이라는 뜻이다. test ! -f $argv[1]
이라고 할 수 있다.
command mv "$@"
는 본래의 command 를 실행한다는 뜻이다. $@
는 all arguments
이기 때문이다. fish 에서는 command mv $argv
라고 하면 된다.
read -ei "$1" newfilename
는 다음과 같이 해석한다. read
는 input 을 받기 위한 명령어이다. -ei "$1"
는 새로운 라인을 받되(-e
), 초기값(-i
)으로 첫번째 argument($1
)를 쓰겠다는 뜻이다. 그러니까 첫번째 argument 를 초기값으로 user 에게 주고, user 가 line delimiter(쉽게 말해 엔터)를 입력하면 그 값을 newfilename
이라는 변수에 담겠다는 뜻이다.
fish 에서는 vared
라는 함수가 제공되는데, 이를 이용하면 조금 더 간편하게 표현할 수 있다. vared newfilename
이 때 초기값을 주고 싶다면, set newfilename $argv[1]
을 이전에 선언하면 된다.
함수 이름을 mv 로 해서 기존의 mv 명령어를 감싸기 보다는 rename 이라고 명확하게 표현하는 것이 좋겠다. 최종 결과물은 링크에 올려두었다.