많은 수의 파일 이름에서 숫자 열을 바꾸는 방법

많은 수의 파일 이름에서 숫자 열을 바꾸는 방법

다음과 같은 이름의 많은 파일 이름을 바꾸고 싶습니다.

cc cc nn - ccccccc ccc cccccccc - nnnnnn.mp3

여기서 "c"는 문자를 나타내고 "n"은 숫자를 나타냅니다.

cc cc nn - ccccccc ccc cccccccc - nnnnnn.mp3
                                  ^^^^^^ these (^) are the numbers I want to change.

000001, 000002, ..., 084521 같은 숫자를 원해요

저는 Linux를 사용하고 있으며 일반적인 명령줄 도구를 모두 사용할 수 있습니다.

기본적으로 파일 이름의 위치 35-40을 계산 중인 숫자로 바꾸고 싶습니다.

답변1

Ubuntu를 포함한 Debian 기반 시스템에서 호출되는 경우 다음을 수행할 수 perl-rename있습니다 .rename

rename -n 's/\d+.mp3$/sprintf("%06d",$c++) . ".mp3"/e' *mp3

설명하다

  • 아무것도 이름을 바꾸지 않고 수행할 작업만 인쇄합니다 -n. rename명령이 원하는 대로 작동한다고 확신하면 제거하십시오.
  • s/foo/bar/e: 이것은 대체 연산자입니다 foo. bar마지막 연산자는 e연산자 오른쪽에 있는 모든 명령을 평가하고 해당 출력으로 대체합니다.
  • \d+.mp3$.mp3: 파일 이름으로 끝나는 가장 긴 숫자와 일치합니다( ) $.
  • sprintf("%06d",++$c) . ".mp3": 이 sprintf명령은 변수의 내용을 인쇄합니다 $c. 1을 추가하면 앞에 6개의 0이 있습니다. $c명령이 처음 실행될 때 초기화되지 않으므로 1 ++$c이 됩니다. 그런 다음 와 연결합니다 .mp3.

이 모든 것의 최종 결과는 확장 전 숫자를 증가하는 0 패딩 숫자로 바꾸는 것입니다.

$ rename -n 's/\d+.mp3$/sprintf("%06d",++$c) . ".mp3"/e' *mp3
cc cc nn - ccccccc ccc cccccccc - 123401.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000001.mp3
cc cc nn - ccccccc ccc cccccccc - 123402.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000002.mp3
cc cc nn - ccccccc ccc cccccccc - 123403.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000003.mp3
cc cc nn - ccccccc ccc cccccccc - 123404.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000004.mp3
cc cc nn - ccccccc ccc cccccccc - 123405.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000005.mp3
cc cc nn - ccccccc ccc cccccccc - 123406.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000006.mp3
cc cc nn - ccccccc ccc cccccccc - 123407.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000007.mp3
cc cc nn - ccccccc ccc cccccccc - 123408.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000008.mp3
cc cc nn - ccccccc ccc cccccccc - 123409.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000009.mp3
cc cc nn - ccccccc ccc cccccccc - 123410.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000010.mp3
cc cc nn - ccccccc ccc cccccccc - 123411.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000011.mp3
cc cc nn - ccccccc ccc cccccccc - 123412.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000012.mp3
cc cc nn - ccccccc ccc cccccccc - 123413.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000013.mp3
cc cc nn - ccccccc ccc cccccccc - 123414.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000014.mp3
cc cc nn - ccccccc ccc cccccccc - 123415.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000015.mp3
cc cc nn - ccccccc ccc cccccccc - 123416.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000016.mp3
cc cc nn - ccccccc ccc cccccccc - 123417.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000017.mp3
cc cc nn - ccccccc ccc cccccccc - 123418.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000018.mp3
cc cc nn - ccccccc ccc cccccccc - 123419.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000019.mp3
cc cc nn - ccccccc ccc cccccccc - 123420.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000020.mp3

답변2

쉘 스크립트로:

tempdir="$(mktemp -d)"
i=0; for file in *.mp3; do
  i=$((i+1))
  mv -- "$file" "$tempdir/${file%%[0-9]*.mp3}$(printf '%06d.mp3' "$i")"
done
mv "$tempdir"/* . && rmdir "$tempdir"

mp3 디렉터리에서 이 스크립트를 실행하세요. 이미 존재하는 파일 이름으로 이름이 바뀌는 것을 방지하기 위해 임시 디렉토리를 생성하고 이름이 바뀐 파일을 해당 디렉토리로 이동합니다. 모든 파일이 처리된 후 해당 파일은 현재 디렉터리로 다시 이동됩니다.

파일 이름을 반복할 때 파일 이름에서 기존 접미사를 제거하고 ${file%%[0-9]*.mp3}대상 파일 이름에 접두사가 없는 새로운 접미사를 추가합니다.nnnnnn.mp3$(printf '%06d.mp3' "$i")

관련 정보