bash: 파일 확장자를 반환하는 방법은 무엇입니까?

bash: 파일 확장자를 반환하는 방법은 무엇입니까?

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

저는 Linux와 bash를 처음 접했고 기본 스크립트 작성 방법을 배우려고 합니다. 감사해요!

답변1

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

답변2

그리고매개변수 확장:

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

${parameter##word}모드는 일치하는 가장 큰 접두사 word(파일 끝을 제외한 모든 접두사)를 제거합니다.

답변3

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

#!/usr/bin/env bash

echo "$1" | awk -F '.' '{print $NF}'

스크립트는 다음과 같이 호출되며 script.sh test.txt수행되는 작업은 다음과 같습니다.

  • $1표준 출력으로 인쇄됩니다 . $1은 스크립트에 제공된 첫 번째 매개변수입니다(이 경우 ) test.txt.

  • stdout 출력은 echostdin으로 파이프되며, awk여기서 문자열은 분할( test.txt) .이고 분할의 마지막 요소( txt이 경우)가 인쇄됩니다.

아주 간단한 작업이므로 한 문장으로 간단히 설명할 수 있습니다.

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

답변4

이를 위해서는 고려해야 할 몇 가지 고려 사항이 있습니다.

  • 파일 foo.d/bar에 확장자가 없습니다. 확장자 foo가 있는 파일이 아닙니다..d/bar
  • .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

관련 정보