bash : 파일 확장자를 어떻게 반환합니까?

입력 파일 이름의 확장자 만 반환하는 스크립트를 작성하고 싶습니다. 예를 들어 textfile.txttxt를 반환해야합니다.

저는 Linux 및 bash를 처음 사용하며 기본적인 스크립트를 작성하는 방법을 배우려고합니다. 감사합니다!

댓글

kernel.org ? 시스템에서 가장 확실하게 사용할 수있는 /bin/bash 파일의 확장자는 무엇입니까? " 파일 확장자 "의 개념은 Linux에서 상당히 낯설습니다. 점 뒤의 부분은 시스템에 거의 의미가 없습니다. 사용자가 해당 파일에서 무엇을 기대할 수 있는지에 대한 신호입니다. 그리고 그 단서는 거짓 일 수도 있고 틀릴 수도 있습니다.

Answer

예를 들어 bash는 많은 문자열 조작 기능. 그중 하나를 사용하면 주어진 패턴까지 모든 것을 제거 할 수 있습니다.

${VAR##GLOB} 

위 구문은 변수 $VAR glob GLOB의 첫 번째 일치까지. 따라서 이름없이 파일의 확장자를 인쇄하려면 다음을 수행 할 수 있습니다.

$ file="file.txt" $ echo ${file##*.} txt 

이 방법은 둘 이상의 “확장자”를 처리 할 수도 있습니다.

$ file="file.new.txt" $ echo ${file##*.} txt 

원하지 않는 경우 하나의 #를 대신 사용하십시오. 그러면 대신 가장 짧은 일치 항목이 제거됩니다. 가장 긴 것 중 :

$ echo ${file#*.} new.txt 

이제 디렉터리의 모든 파일에 대해 실행하려면 다음을 수행 할 수 있습니다.

$ ls file.avi file.pdf file.png file.txt $ for file in *; do echo "$file : ${file##*.}"; done file.avi : avi file.pdf : pdf file.png : png file.txt : txt 

완벽 함을 위해 ${file%.*}를 사용하여 확장자없이 파일 이름을 가져올 수도 있습니다.

$ for file in *; do echo "$file : ${file##*.} : ${file%.*}"; done file.avi : avi : file file.pdf : pdf : file file.png : png : file file.txt : txt : file 

댓글

  • 이것은 foo / .git / bar와 같은 항목에서는 작동하지 않습니다. ' / baz echo test.txt | awk -F ' / ' ' {print $ NF} ' | awk -F '. ' ' {print $ NF} '
  • @PaulM 무슨 뜻입니까? ' 확장자가없는 파일입니다.이 파일에서 무엇을 얻을 수 있을까요?
  • echo " / foo /var/.git/foo/bar.bz" | awk -F ' / ' ' {print $ NF} ' | awk -F '. ' ' {print $ NF} ' == > > bz
  • @PaulM file="/foo/var/.git/foo/bar.bz"; echo "${file##*.}" : bz. ' 문제가 없습니다.

답변

매개 변수 확장 :

$ x="textfile.txt" $ echo ${x##*.} txt 

${parameter##word} 패턴은 word (파일 끝자리를 제외한 모든 항목)와 일치하는 가장 큰 접두사를 제거합니다.

Answer

원하는 작업을 수행 할 수있는 매우 간단한 bash 스크립트는 다음과 같습니다.

#!/usr/bin/env bash echo "$1" | awk -F "." "{print $NF}" 

스크립트는 script.sh test.txt 그리고 그 기능은

  • $1를 stdout에 인쇄합니다. $1는 스크립트에 제공되는 첫 번째 매개 변수입니다 (이 경우 test.txt).

  • echo의 stdout 출력은 문자열을 분할하는 awk의 stdin으로 파이프됩니다 (test.txt) .에서 분할의 마지막 요소를 인쇄합니다 (이 경우 txt).

간단한 말입니다. “매우 간단한 작업이기 때문에 한 줄로 처리 할 수 있습니다.

echo test.txt | awk -F "." "{print $NF}" 

댓글

  • $1 주위에 따옴표를 추가해야합니다. 그렇지 않으면 공백 등이 포함 된 파일 이름이 깨질 위험이 있습니다.
  • 이것은 ' foo / .git / bar / baz와 같은 일에서 작동하지 않습니다. echo test.txt | awk -F ' / ' ' {print $ NF} ' | awk -F '' ' {print $ NF} '

답변

#!/bin/bash my_file=`basename "$1"` # get full file name as a script parameter and strip the path my_extension="${my_file##*.}" my_file="${my_file%.*}" # will return base file name before the extension echo "$my_file" echo "$my_extension" 

실행 :

./script.sh index.html 

출력 :

index html 

추가 정보 : 쉘 매개 변수 확장 | gnu.org

답변

그렇게하려면 몇 가지주의 사항을 고려해야합니다.

  • foo.d/bar 파일에는 확장자가 없습니다. iv id = “가있는 foo 파일이 아닙니다. 5dcf1af6e9 “>

확장.

  • .bashrc에 확장이 없음을 고려할 수도 있습니다.
  • ... 특수 디렉토리 파일은 특별히 취급해야하며 확장자가없는 것으로 간주해야합니다.
  • 확장자는 무엇입니까? file.tar.gz? gz 또는 tar.gz? holiday.picture.jpg 또는 bash-4.4는 어떻습니까?
  • foo.d/? 비어 있거나 d?
  • 여기에서 할 수 있습니다.

    #! /bin/sh - for file do case ${file##*/} in (?*.*) ext=${file##*.};; (*) ext=;; esac printf "%s\n" "$ext" done 

    주석

    • 특히 함수로서 일반적인주의 사항과 유용한 코드를 처리하는 탁월한 답변입니다.

    답변

    sed 또는 Perl이 설치된 경우 몇 가지 옵션을 추가하겠습니다.

     #!/bin/bash ext=$(<<<"$1" sed -n "s/^[^.]*\.//p") printf "Extension: $ext\n" ext=$(<<<"$1" perl -ne "s/^.*?\.//&&print") printf "Extension: $ext\n" exit 0  
    • s/^[^.]*\.//p iv id = “617e5dd2cf perl의 “>

    s/^.*?\.//&&print : . 뒤에 문자열 시작 부분에 . 문자가 있습니다. 대체 할 수있는 경우 대체 결과를 인쇄합니다.

     % bash script.sh file.bin Extension: bin Extension: bin  

    답변

    주의하세요. Unix / Linux (및 MacOS)에서 “파일 이름 확장자”는 정보 용일뿐입니다 (그 정도라면). photo.gif라는 Perl 스크립트 또는 poem.txt라는 GIF 파일을 완벽하게 가질 수 있습니다. 또는 some.txt.png라는 파일도 있습니다.

    댓글

    • 그것 ' MS Windows에서와 마찬가지로 ' 기본 셸 프로그램이 확장-콘텐츠 페어링에 대해 더 강력한 가정을하고 있으며 이름과 내용의 불일치, 일반적으로 모든 것이 오류를 외치기 시작합니다.

    답글 남기기

    이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다