파일 이름을 일괄적으로 바꾸고 싶습니다
A-B-C#2-D.wav
. A-B-C#1-D.wav
예를 들면 다음과 같습니다.
A-B-C#2-D.wav
A-B-C#8-G.wav
A-B-C6-E.wav
~이 되다
A-B-C#1-D.wav
A-B-C#7-G.wav
A-B-C5-E.wav
따라서 세 번째 하위 문자열의 숫자는 마이너스 1이 되어야 합니다. ( #
주석이 아닌 파일 이름의 일부; #
파일 이름이 있든 없든 가능합니다.)
답변1
그리고 zsh
:
autoload zmv # best in ~/.zshrc
zmv -n '(*[^0-9])(<1->)(*.wav)(#qn)' '$1$(($2-1))$3'
(만족하면 삭제 -n
)
이름을 바꾸기 (#qn)
위해 목록을 숫자순으로 정렬하는 데 사용됩니다.A-B-C#9-D.wav
앞으로 A-B-C#10-D.wav
예를 들어.
그러나 a A-B-C#9-D.wav
와 가 모두 A-B-C#10-D.wav
있으면 zmv
파일 이름이 기존 파일 이름으로 바뀌는 것으로 표시되고 명령이 중단됩니다. -f
이를 계속 적용하려면 옵션을 추가해야 합니다 .
또는 zsh(숫자 전역 순서의 경우) 및 perl
이름 바꾸기를 사용하십시오.
rename -n 's/\d+/$&-1/e' ./*[1-9]*.wav(#qn)
-f
(일부 변형과 동일한 경고 및 옵션 rename
)
답변2
bash 관련 루프 사용(정규식 테스트 조건의 경우 =~
):
for file in ?-?-*-?.wav
do
[[ $file =~ ^([^[:digit:]]+)([[:digit:]]+)(-.\.wav)$ ]] &&
echo mv -- "$file" "${BASH_REMATCH[1]}$((10#${BASH_REMATCH[2]} - 1))${BASH_REMATCH[3]}"
done
와일드카드를 사용하여 필요한 wav
파일을 선택합니다. 일치하는 파일은 .wav
대시 사이와 끝 앞에 문자(문자)가 하나 있습니다. 각 파일 이름은 정규 표현식을 통해 실행되며 이를 세 부분으로 나눕니다.
^([^[:digit:]]+)
——입문 부분까지;하지만 포함하지 않습니다첫 번째 숫자([[:digit:]]+)
-- 숫자(-.\.wav)
-- 후행 부분
일치에 성공하면 앞부분, 숫자에서 1을 뺀 부분, 뒷부분을 사용하여 파일 이름을 바꿉니다.
echo
출력이 올바르게 보이면 제거하십시오.