대량 소문자 파일 확장자

대량 소문자 파일 확장자

파일 확장자를 대문자에서 소문자로 바꾸는 명령은 무엇입니까?

예:

hello.JPG
hi.JPG

도착하다:

hello.jpg
hi.jpg

답변1

다루고 있는 파일 확장자를 알고 있다면 하드코딩할 수 있습니다.

for f in *.JPG
do
  mv "$f" "${f%.JPG}.jpg"
done

보다 일반적인 경우:

for f in *
do 
  e="${f##*.}"
  b="${f%.*}"
  mv "$f" "${b}.${e,,}"
done

힘든 일이 끝나는 곳bash 변수 확장도착하다:

  • 확장자를 저장합니다. (마침표를 찾을 때까지 파일 이름 앞에서 최대한 많은 것을 제거합니다.)
  • 파일 이름의 나머지 부분을 저장하십시오(적어도 파일 이름 끝의 마침표는 제거하십시오).
  • 파일 이름을 새 파일 이름으로 바꾸고, 프로세스 ,,에서 확장자( )를 소문자로 변경합니다.

답변2

아직 나열되지 않은 다른 답변을 추가하면 됩니다.

for f in *.JPG; do mv "$f" "${f//JPG/jpg}"; done

답변3

rename ' -f and /[A-Z][^.]*$/ and s/\.[^.]+$/\L$&/' *

rename ' -f and s/\.[^.]*[A-Z][^.]*$/\L$&/' *

우리는 그 배후에는 rename단지 코드가 있을 뿐이 라는 사실을 깨달아야 합니다 Perl. 다음과 같이 생각해보세요. 와일드카드는 *a의 이 코드에 이름을 제공 loop하고 각 이름에 대해 다음을 수행합니다.

  • 현재 이름(루프 컨테이너에 저장됨 $_)이 일반 파일인지 테스트합니다(파일 테스트 연산자 -f파일 이름, 파일 이름이 생략되면 기본값 $_) 참고: 우리가 원하는 파일 테스트가 이전에 Space를 사용하여 규칙을 적용하는 옵션이라고 rename생각하는 것을 방지합니다. 이 가능성을!-f-f
  • 파일 이름이 대문자로 시작하지 않으면 이름을 바꾸는 것이 의미가 없습니다. 따라서 우리는 다음 정규식을 사용하여 파일 이름 확장자에서 이 사실을 확인합니다. /[A-Z][^.]*$/이는 파일 이름의 끝 부분에서 보이는 점이 아닌 연속 문자를 살펴보고 파일 이름의 확장자 부분에 하나 이상의 대문자가 존재하는지 확인 합니다. . 확장을 말할 수 없는 상황이 발생할 수 있습니다. 이 사실은 .파일 이름에서 텍스트를 찾는 다음 단계에서 다루겠습니다 .
  • 이제 우리는 현재 파일 이름이 일반 파일이고 적어도 하나의 대문자가 존재하므로 이름을 바꿀 수 있는 후보라는 것을 알았습니다. 정규식은 s/\.[^.]+$/\L$&/파일 이름의 끝에서 왼쪽을 보고 [^.]+리터럴 텍스트가 보일 때까지 점이 아닌 문자를 모두 잡아서 현재 파일 이름의 전체 확장자 부분을 분리합니다 \.. \L$&일치하는 텍스트의 모든 대문자를 소문자로 변환합니다 .
  • s///하나의 명령 자체에서 확장 대문자 사용을 확인하는 모든 작업을 수행하는 두 번째 버전을 추가했습니다.
  • 특별 참고 사항: 일반적 m//으로 s///연산자를 통해 추가된 문자열에 대해 작동합니다 =~(예: ) $var =~ m/[A-Z]+/ $filenm =~ s/ABC/DEF/. 그러나 문제의 변수가 =~인 경우 $_=~를 생략하고 간단히 작성하면 m/[A-Z]+/ s/ABC/DEF/이 정규 표현식이 작동하는 변수가 is임을 의미합니다 $_. 또한 구분 기호가 슬래시 m인 경우 생략할 수 있습니다. m//하지만 만일의 경우에 대비해 꼭 필요합니다 m{} m||. 이것은 매우 일반적인 Perl스타일 관용구입니다.

관련 정보