Update 2020년 12월 7일


원본 링크: Rename files in linux / bash using mv command without typing the full name two times

재밌어 보이기도 하고, 또 오랜만에 shell script 를 만져보고 싶어서 내 개발 환경에 맞게 변환하는 작업을 간단히 기록한다(나는 fish shell 을 사용한다).

Function 선언

function mv()function mv

bash 와 fish 문법이 살짝 다르다.

조건문

if [ "$#" -ne 1 ] || [ ! -f "$1" ]; then

if A or B 라는 뜻이다. 이때 A"$#" -ne 1이다. $#number of arguments를 뜻한다. -nenot 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 실행

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 이라고 명확하게 표현하는 것이 좋겠다. 최종 결과물은 링크에 올려두었다.