入力ファイル名の拡張子のみを返すスクリプトを作成したいと思います。たとえば、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出力は
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