현재 대규모 파일 그룹의 이름을 바꾸려고 하는데 다음과 같이 다소 서투른 방법을 사용하고 있습니다.
rename 's:(.*)\.MOV:$1.mov:g' *.MOV
rename 's:(.*)\.JPG:$1.jpg:g' *.JPG
제가 정말로 원하는 것은 다음을 사용하여 이러한 모든 명령을 결합할 수 있는 것입니다.'y' sed
연산자. 분명히 이 연산자를 사용하면 항목을 소문자로 변환할 수 있습니다. 문제는 확장자를 변환하기만 하면 된다는 것입니다. 이 명령을 사용하여 이를 수행할 수 있는 방법이 있습니까? 다음 표현식의 캡처 그룹을 소문자로 변환해야 합니다 ^.+\.(.+)$
. 이를 수행할 수 있는 방법이 있습니까? 나는 이러한 변화에 조금 익숙합니다.
답변1
rename
구문론적으로 이는 Debian, Ubuntu 및 그 파생 버전의 Perl 기반 버전입니다. 당신은 사용할 수 없습니다tr
운영자전체 문자열에 작용하기 때문입니다. 하지만 넌 할수있어경기 확장, 소문자로 입력하세요.그리고\L
.
rename 's/\.[^.]*$/\L$&/' *.JPG *.MOV
여기서는 불필요하지만 정규식이 소문자로 표시하려는 부분보다 더 많이 일치하는 경우 일치하려는 부분을 넣을 수 있습니다.그룹:
rename 's/\.([^.]*)$/.\L$1/' *.JPG *.MOV
확장자에 관계없이 모든 파일에 대해 작동하려면 다음 *.JPG *.MOV
으로 바꾸십시오 . *.*
bash ≥4.3(및 bash 4.0-4.2에서는 디렉터리의 심볼릭 링크도 통과함)에서 하위 디렉터리의 파일 등에 대해 쉽게 재귀적으로 작업할 수 있습니다.
rename 's/\.[^.]*$/\L$&/' **/*.*
~을 위한zsh 팬( :r
그리고:e
수정자파일의 나머지 부분에서 확장자를 분리합니다.
autoload zmv
zmv '*.(MOV|JPG)' '${f:r}.${(L)f:e}' # these extensions, current directory
zmv '*.*' '${f:r}.${(L)f:e}' # all extensions, current directory
zmv '**/*.*' '${f:r}.${(L)f:e}' # all extensions, recursive directory traversal