확장자가 약간 다른 여러 파일의 이름을 바꾸는 방법은 무엇입니까?

확장자가 약간 다른 여러 파일의 이름을 바꾸는 방법은 무엇입니까?

여러 개의 파일이 있고 모두 비슷한 이름 지정 패턴을 가지고 있습니다. 예를 들면 다음과 같습니다.

{filename}.jpeg{random number}

.jpeg 확장자를 갖도록 이 파일의 이름을 바꾸고 싶습니다. 어떻게 해야 하나요?

답변1

Larry Wall의 Perl 이름 변경이 있는 경우

rename 's/[.]jpeg[0-9]*/.jpeg/' *.jpeg[0-9]*

Util-Linux만 있는 경우 이름 바꾸기가 작동하지 않습니다.

Bash에서 for 루프를 사용할 수 있습니다

for n in *.jpeg[0-9]*
do mv -i "$n" "${n%%.jpeg[0-9]*}.jpeg"
done

${var%%pattern}표준 매개변수 확장값으로 확장하고 var일치 항목의 (가장 긴) 후행 부분을 제거합니다 pattern. 그렇다면 n그렇습니다 foo.jpeg123.${n%%.jpeg[0-9*}foo​( foo.jpeg1abc원인이 될 수도 있습니다 foo.)

답변2

실행하기 전에 '를 사용하는 것이 좋습니다. zsh이렇게 zmv하면 잠재적인 충돌을 방지할 수 있습니다(예: a file.jpeg1와 파일이 모두 현재 디렉터리에 존재함).file.jpeg2어느이름을 바꿔라.

존재하다 zsh:

autoload zmv # best in ~/.zshrc
zmv -n '(*.jpeg)<->' '$1'

여기서 <->( <x-y>여기서 일치하는 숫자의 범위는 제한이 없습니다) 는 와 마찬가지로 임의의 10진수 시퀀스와 일치합니다 [0-9]##.

( 만족스러우면 -n시험 실행을 위해 제거하십시오 ).

답변3

각 이름에 하위 문자열이 하나만 있고 .jpeg표준 쉘 루프를 사용하여 해당 하위 문자열 뒤의 모든 항목(숫자든 다른 문자열이든)을 제거하려고 한다고 가정합니다.

for name in *.jpeg*; do
    mv -i -- "$name" "${name%.jpeg*}.jpeg"
done

매개변수 대체는 값에서 ${name%.jpeg*}그 뒤에 오는 모든 항목을 제거 합니다. 그런 다음 교체 결과에 해당 문자열을 추가하여 새 파일 이름을 만듭니다..jpeg$name.jpeg

mv -i --이 비트는 기존 이름을 덮어쓰기 전에 확인을 요청하는 방식으로 호출됩니다 . 이는 이름이 대시(명령줄 옵션의 끝을 나타냄)로 시작하는 경우 다음 파일 이름이 실수로 옵션 집합으로 인식되는 것을 방지하기 위한 것입니다 mv.----

관련 정보