bash:ファイル拡張子を返す方法は?

bash:ファイル拡張子を返す方法は?

入力ファイル名の拡張子のみを返すスクリプトを作成したいと思います。たとえば、textfile.txt を返す必要がありますtxt

私はLinuxとbashに初めて触れ、基本的なスクリプトを書く方法を学びたいと思います。ありがとうございます!

答え1

bashのようなシェルにはいくつかあります。文字列演算特徴。そのうちの1つを使用すると、特定のパターンより前のすべてのアイテムを削除できます。

${VAR##GLOB}

$VAR上記の構文は、globと最初に一致するまで変数からすべてを削除しますGLOB。したがって、ファイル名を表示せずにファイル拡張子を印刷するには、次のようにします。

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

これは複数の「拡張」を処理することもできます。

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

これを望まない場合は、代わりに1つを使用してください。これにより#、最長一致の代わりに最短一致が削除されます。

$ 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.gzgzまたはtar.gzholiday.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

関連情報