5개의 mp3 파일이 있다고 가정해 보겠습니다.
01-trackfoo.mp3
02-trackbar.mp3
03-trackbaz.mp3
04-trackabc.mp3
05-trackxyz.mp3
이제 파일을 빠르게 들어보고(콘솔의 mplayer만 있으면 됩니다) 트랙이 어디에 있는지 확인합니다.잘못된 순서. 05는 실제로 02이고 나머지는 이름을 바꿔야 합니다. 먼저 임시 이름을 바꾸겠습니다.
01-trackfoo.mp3
02-trackbar.mp3
03-trackbaz.mp3
04-trackabc.mp3
00-trackxyz.mp3
이제 "변환"이 필요합니다. 02는 03이 되고, 03은 04가 되고, 04는 05가 되어야 합니다. 혼란을 최소화하기 위해 ex-05(현재 00)는 추후 수정하겠습니다 mv
.
내 방법은 다음과 같습니다. (perl rename
, 저자 Larry Wall, Debian에서는 기본값)
rename 's/0([2-4])([\s\S]+)/0($1+1)$2/' *
그리고 (나중에 더 많은 RTFM을 거친 후)
rename 's/0([2-4])([\s\S]+)/0($1+1)$2/e' *
그 중 어느 것도 작동하지 않습니다. 특히 /e[val]
수정자는 다른 것을 허용하지 않기 때문에 더욱 그렇습니다.하지만평가하고 평가를 문자열과 결합하려고 하면 즉시 오류가 발생합니다. 잘할 수 있다 bash
, 예를 들어 foo$((1+6))
로 평가될 것이다 foo7
.
그러면 어떻게 해야 합니까(단일 라인이 선호되며 이에 대한 완전한 독립 실행형 스크립트를 작성할 계획은 없습니다)?
답변1
당신은 거의 그것을 가지고 있습니다. /e
따옴표와 점 연산자를 사용하여 수정된 대체 항목에서 리터럴 문자열과 문자열 연결을 명시적으로 표시하기 만 하면 됩니다 .
rename 's/0([2-4])([\s\S]+)/"0".($1+1).$2/e' *
답변2
이에 대한 완전한 독립형 스크립트를 작성하지 않고 한 줄 스크립트를 선호합니다.
상황이 이렇게 복잡해지면 스크립트를 작성하지 않을 이유가 없습니다. 한 실행에서 다음 실행까지 실행하는 방법을 기억하지 못하기 때문에 매번 다시 만들거나 스크립트로 래핑하게 됩니다.
이와 같은 작은 문제의 경우 일반적으로 Bash에서 해결하려고 노력하는 것부터 시작합니다.
#!/bin/bash
if [ -z "$1" ] ; then echo Need arguments. ; exit 1 ; fi
typeset -i i=1
for f in "$*"
do
tailbits=`echo "$f" | sed -e 's/^[0-9]+//'`
mv "$f" sertmp-`printf %02d $i`"$tailbits"
i=i+1
done
for f in "sertmp-*"
do
mv "$f" `echo "$f" | sed -e s/^sertmp-//`
done
기본적으로 스크립트는 모든 선행 숫자를 제거하고 앞에 0으로 채워진 증분 일련 번호를 추가하며 파일은 스크립트에 전달한 순서에 따라 번호가 매겨집니다.
이 작업은 두 단계로 수행됩니다. sertmp-
첫 번째 단계에서는 이름 충돌 위험을 피하기 위해 접두사를 사용합니다. 이 스크립트를 호출 mp3-renamer
하고 다음과 같이 호출 하면 :
$ mp3-renamer 01-foo.mp3 03-bar.mp3 04-qux.mp3
이름 바꾸기에 2개의 패스를 사용하지 않으면 첫 번째 이름 바꾸기에서 약간의 충돌이 발생합니다. ( 01-foo.mp3
-> 01-foo.mp3
.)
하지만 다음과 같이 호출하면:
$ mp3-renamer 02-foo.mp3 01-foo.mp3
01-foo.mp3
처음 이름을 바꾸었을 때 실수로 이름 바꾸기를 삭제했습니다 .
문제가 더 복잡해지면 Perl로 다시 작성하겠습니다. 이 시점에서 해시를 사용하여 이전 이름과 새 이름의 매핑을 저장할 수 있으며, 두 번의 패스가 필요하지 않도록 이름 바꾸기를 수행하는 올바른 순서를 알아내는 몇 가지 영리한 코드를 사용할 수 있습니다.