여러 개의 파일이 있고 모두 비슷한 이름 지정 패턴을 가지고 있습니다. 예를 들면 다음과 같습니다.
{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
.--
--