Bash: 구분 기호에서 1을 뺀 부분 문자열로 분할됨

Bash: 구분 기호에서 1을 뺀 부분 문자열로 분할됨

파일 이름을 일괄적으로 바꾸고 싶습니다 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대시 사이와 끝 앞에 문자(문자)가 하나 있습니다. 각 파일 이름은 정규 표현식을 통해 실행되며 이를 세 부분으로 나눕니다.

  1. ^([^[:digit:]]+)——입문 부분까지;하지만 포함하지 않습니다첫 번째 숫자
  2. ([[:digit:]]+)-- 숫자
  3. (-.\.wav)-- 후행 부분

일치에 성공하면 앞부분, 숫자에서 1을 뺀 부분, 뒷부분을 사용하여 파일 이름을 바꿉니다.

echo출력이 올바르게 보이면 제거하십시오.

관련 정보