심지어 파일 이름 바꾸기

심지어 파일 이름 바꾸기

책의 스캔 페이지 이미지를 일부 수집했습니다. 총 페이지 수는 약 10,000페이지입니다. 책은 양면 페이지에 텍스트와 번역이 포함된 이중 언어로 인쇄됩니다. 번역본은 폐기되고 원본 페이지, 즉 짝수 페이지만 남습니다.

올바른 페이지 번호를 포함하려면 파일 이름이 필요하며 현재는 간단한 순서로 되어 있습니다. 사용하기 좋 rename거나 비슷합니다.

명확성을 위해 현재 문서 번호 지정 형식은 다음과 같습니다.

1-001.png
1-002.png
1-003.png
 ...

첫 번째 숫자 1은 롤 번호이며 변경되지 않습니다. 두 번째 숫자는 페이지 번호이며 다음과 같이 변경해야 합니다.

1-002.png
1.004.png
1-006.png
 ...

답변1

이름 바꾸기 명령은 다음과 같습니다.

rename -n 'our $i=2;s/^(\d+)-(\d+)/sprintf("$1-%04d", $i*$2)/e' *.png

결과:

1-001.png renamed as 1-0002.png
1-002.png renamed as 1-0004.png
1-003.png renamed as 1-0006.png
1-004.png renamed as 1-0008.png
1-005.png renamed as 1-0010.png
...
2-001.png renamed as 2-0002.png
2-002.png renamed as 2-0004.png
2-003.png renamed as 2-0006.png
2-004.png renamed as 2-0008.png
2-005.png renamed as 2-0010.png
-n, --아무 작업도 하지 않음
            작업 없음: 이름이 바뀔 파일을 표시합니다.

나는our $i펄 전역 변수설정하는 데 사용하는 값입니다 2.

(\d+)-(\d+): (\d+)파일 이름의 시작 부분을 하나 이상의 숫자와 일치시키고 이를 그룹으로 캡처한 다음 -파일 (\d+)이름에서 대시() 뒤의 모든 숫자를 다시 일치시켜 -그룹으로 캡처합니다.

^처음에는 () 와 같은 숫자로 시작 하지 않는 경우 파일 이름 바꾸기를 방지/건너뛰고 , 로 시작하는 경우에만 파일 이름을 바꾸도록 ^(\d+)-(\d+)합니다 .^a11.001.pngdigit-digit.png

sprintf("$1-%04d", $i*$2): 먼저 $1인덱스(또는 해당 역참조)를 사용하여 그룹 캡처를 인쇄한 다음(첫 번째 항목 참조 (\d+)), 최대 필드 너비가 4( )인 그룹의 새로 계산된 값을 인쇄 ^(\d+)-(\d+)하고 빈 필드를 0으로 채웁니다( ).$2%4d%04d

참고: 명령 %04d에 사용한 이유는 sprintf이름을 로 바꾸려고 할 1-001.png1-002.png파일이 1-002.png이미 존재하고 이름을 바꿀 수 없기 때문입니다. 그래서 이 오류를 피하기 위해 두 번째 필드 앞에 0을 추가했습니다.


또는 @muru가 제안한 대로 전역 변수 대신 역참조를 사용할 수 있습니다.

rename -n 's/^(\d+)-(\d+)/sprintf("$1-%04d",$2*2)/e' *.png

$1first 의 역참조이고 (\d+), $2second 의 역참조입니다 (\d+). (group)그룹으로 캡처하려면 한 쌍의 괄호를 사용해야 합니다 .

-n마지막으로 명령에서 옵션을 제거하여 파일 이름을 바꿀 수 있습니다 .

답변2

각 페이지 번호에 2를 곱한다고 가정해 보겠습니다.

#!/bin/sh

tmpext=tmpext # temporary extension to avoid clobbering existing files

# double the page number and change .png to tmpext
for page in ./*-[[:digit:]][[:digit:]][[:digit:]].png; do
  vol=${page%-*}
  num=${page#$vol-}
  num=${num%.png}
  zeroes=${num%%[!0]*}
  num=${num#$zeroes}
  tmppage=${vol}-$(printf %.3d $((num * 2))).$tmpext
  mv -vi "$page" "$tmppage"
done

# move .tmpext back to .png
for tmppage in ./*."$tmpext"; do
  mv -vi "${tmppage}" "${tmppage%$tmpext}png"
done

관련 정보