파일 확장자를 대문자에서 소문자로 바꾸는 명령은 무엇입니까?
예:
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
스타일 관용구입니다.