サイトアイコン スグブログ

【シェルスクリプト】ファイル名を取得する方法!エラー対処法あり

テーブル

シェルスクリプトでファイル名を取得して使用する場合も多くあります。

そんな時どうすれば良いのかを記事にしました。

またエラーが出た時の体験や、ディレクトリのみ取得したりと付加価値のある記事にしました。

windowsのプロンプトで使用できるbatやpythonやphpを使用して、業務効率化やWebサイトを作成しております。javaやシェルスクリプトなど、様々なプログラミングを行った実績ありの筆者です。

実行した結果も詳しく載せているので、この記事を読めばシェルスクリプトでファイル名を取得する方法が簡単に理解できます。

シェルスクリプトで変数からファイル名を取得する方法!

ファイルを取得する方法は複数あります。

主に以下の方法があります。

シェルスクリプトでファイル名を取得する方法2選
  • 「${変数##*/}」でファイル名取得する
  • 「basename」コマンドでファイル名を取得する

変数から一部を抽出してファイル名を取得する

下のシェルスクリプトを記述します。

#!/bin/bash

file="/var/log/test1"
echo ${file##*/}

変数から一部を抽出してファイル名を取得するコード説明

「file」という変数に絶対パスで「test1」というファイルを入れています。

変数の一部を取得してファイル名だけを表示したい時は、「${file##*/}」を使用します。それをechoコマンドで表示しています。

絶対パスの前から「/」を探して最長一致(最後に見つかった)の「/」以降を表示してくれます。

つまりディレクトリは省いてファイル名のみ取得してくれます。

変数から一部を抽出してファイル名を取得するスクリプトを、実行した結果は以下となりました。

[root@localhost workspace]# bash get-filename.sh
test1

シェルスクリプトを実行する方法の詳細は、以下の記事を参考にしてください。

シェルスクリプトを実行する様々な方法の記事

今回のファイル名の「test1」が取得出来ています。

変数から一部を抽出するその他のシェルスクリプト

変数の一部を取得するその他のコードを以下にまとめておきます。

シェルスクリプト最〇一致どこから探すか
${変数##*/}最長一致前から「/」を探す
${変数#*/}最短一致前から「/」を探す
${変数%%/*}最長一致後ろから「/」を探す
${変数%/*}最短一致後ろから「/」を探す
${変数#文字列}最短一致文字列以降が展開
変数の一部を取得するその他のシェルスクリプト一覧

変数の一部を取得するその他のコードについて詳しく知りたいあなたは以下の記事を参照下さい。

変数から一部を抽出してディレクトリのみ取得する

これの応用でファイル名ではなくディレクトリのみ取得してみましょう。

#!/bin/bash

file="/var/log/test1"
echo ${file%/*}

上のシェルスクリプトを記述して実行して見ます。

[root@localhost workspace]# bash get-directory.sh
/var/log

ディレクトリのみ取得出来ています。

変数から一部を抽出してファイル名を取得する時のエラー実体験

ファイル名を取得する時にエラーがでた事があったので紹介しておきます。

以下のコードでシェルスクリプトを実行してみます。

#!/bin/bash

file="/var/log/test1"
echo ${file##/*}

実行した結果は以下となりました。

[root@localhost workspace]# bash get-filename_error.sh
/var/log/test1

ファイル名が取得できていません。

よく見ると「${file##/*}」になっています。正解は「${file##*/}」です。

「ディレクトリ/ファイル名」の構造になっている為「/*」でファイル名が取得できると思っていましたが逆でした。

「basename」コマンドでファイル名を取得する

「basename」コマンドでファイル名を取得するコードを、以下の様に記述します。

#!/bin/bash

file="/var/log/test1"
echo $(basename $file)

「basename」コマンドでファイル名を取得するコードの説明

同じく変数に絶対パスでファイル名を指定しています。

「$()」とする事で、カッコの中のコマンドの実行結果を表示する事ができます。

カッコの中に「basename」コマンドと引数の変数を入れています。

「basename」コマンドでファイル名を取得するシェルスクリプトを実行すると、以下の結果となりました。

[root@localhost workspace]# bash get-filename.sh
test1

結果同じくファイル名の「test1」を取得できました。

コマンドでディレクトリのみ取得する

同じくコマンドでディレクトリのみ取得してみます。

「dirname」コマンドを使用します。

以下のシェルスクリプトを記述して実行してみます。

#!/bin/bash

file="/var/log/test1"
echo $(dirname $file)

結果は以下となりました。

[root@localhost workspace]# bash get-directory-dirname.sh
/var/log

「var/log」とディレクトリのみ取得する事が出来ました。

シェルスクリプトで変数からファイル名を取得する方法!まとめ

シェルスクリプトで絶対パスのファイル名のみ取得する方法は以下の方法があります。

シェルスクリプトでファイル名を取得する方法2選
  • 「${変数##*/}」でファイル名取得する
  • 「basename」コマンドでファイル名を取得する

ちなみにシェルスクリプトを実行しているファイル名を参照する時は「$0」を使用します。

変数の箇所を「$0」にすれば同じ事が可能です。

モバイルバージョンを終了