입력 파일 이름의 확장자만 반환하는 스크립트를 작성하고 싶습니다. 예를 들어 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 출력은
echo
stdin으로 파이프되며,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