잘못된 숫자 형식으로 파일 이름을 일괄 바꾸는 방법은 무엇입니까?

잘못된 숫자 형식으로 파일 이름을 일괄 바꾸는 방법은 무엇입니까?

숫자 형식이 잘못된 파일이 많이 있습니다.

prefix-#.ext       | for files with number 1-9
prefix-##.ext      | for files with number 10-99
prefix-###.ext     | for files with number 100-999

추가 처리로 인해 모든 이름이 다음 형식이어야 합니다 prefix-###.ext. 이를 수행하는 쉬운 방법이 있습니까?

답변1

Debian, Ubuntu 및 그 파생 제품에서는 다음을 사용할 수 있습니다.rename펄 스크립트:

rename 's/(?<=-)([0-9]+)/sprintf "%03d", $1/e' prefix-*.ext

일부 시스템에서는 이 명령을 prename또는 로 설치할 수 있습니다 perl-rename. 이는 renameutil-linux 제품군의 유틸리티가 아니며 이를 수행하는 쉬운 방법을 제공하지 않습니다.

zsh에서는 사용할 수 있습니다zmv이름 바꾸기 및l 매개변수 확장 플래그0으로 채웁니다.

autoload -U zmv
zmv '(prefix-)(*)(.ext)' '$1${(l:3::0:)2}$3'

일반 쉘 루프를 사용하여 이 작업을 수행할 수도 있습니다. 셸에는 문자열 조작을 위한 좋은 구조가 없습니다. 0으로 채우는 한 가지 방법은 1000을 추가하고 선행 1.

for x in prefix-*.ext; do
  n=${x%.ext}; n=${x##*-}; n=$((n+1000))
  mv "$x" "${x%-*.ext}${n#1}${x##*-}"
done

또 다른 방법은 printf유틸리티를 호출하는 것입니다.

for x in prefix-*.ext; do
  n=${x%.ext}; n=${x##*-}
  mv "$x" "${x%-*.ext}$(printf %03d "$n")${x##*-}"
done

답변2

어쩌면 이와 같은 것일 수도 있습니다 (테스트되지 않음)

for n in *.ext; do
    echo mv "$n" \
      "prefix-$(printf %03d "$(basename ${n#prefix-} .ext)").ext"
done

echo실제 이름을 바꾸 려면 삭제하세요 .

참고: 이 방법이 작동하려면 파일과 동일한 디렉토리에 있어야 합니다. 디렉토리 부분을 포함하는 경로 이름을 처리하는 것은 더 복잡합니다.

답변3

for file in prefix-*.ext
do
    num=`echo $file | sed 's/prefix-\(.*\).ext/\1/'`
    [ $num -lt 100 ] && mv $file prefix-`printf "%03d" ${num}`.ext
done

관련 정보