このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

Linuxコマンドの基本:シェルスクリプトのファイル属性の評価

シェルスクリプトのファイル属性の評価

 シェルスクリプトでは、ファイルやディレクトリの存在や属性を評価するための演算子が多数用意されています。これらの演算子を使用することで、ファイルの有無や種類、パーミッションなどを判定し、条件に応じた処理を実行することができます。ここでは、よく使われるファイル属性の評価演算子について解説します。

ファイル属性に関する評価演算子

以下に、代表的なファイル属性の評価演算子をまとめます。

演算子意味
-e filefile が存在する。
-d filefile が存在し、ディレクトリである。
-h filefile が存在し、シンボリックリンクである。
-L filefile が存在し、シンボリックリンクである(-h と同じ)。
-f filefile が存在し、通常のファイルである。
-r filefile が存在し、読み取りパーミッションが与えられている。
-w filefile が存在し、書き込みパーミッションが与えられている。
-x filefile が存在し、実行パーミッションが与えられている。
file1 -nt file2file1 の変更時刻が file2 より新しい。
file1 -ot file2file1 の変更時刻が file2 より古い。

例1:ログディレクトリの存在確認

 次のシェルスクリプトでは、シェル変数 logdir で指定したログディレクトリが存在するかを -d 演算子で確認し、存在しない場合にはエラーメッセージを表示します。

スクリプトの作成

user01@ubuntu:~$ nano log-dir.sh

log-dir.sh の内容

#!/bin/bash

logdir="/Logs"

if [ -d "$logdir" ]; then
    echo "ログディレクトリは: $logdir"
else
    echo "[ERROR] ログディレクトリが見つかりません: $logdir"
fi

解説

  • logdir="/Logs":ログディレクトリのパスを変数 logdir に代入しています。
  • if [ -d "$logdir" ]; then-d 演算子で $logdir が存在し、ディレクトリであるかを確認しています。
  • 条件が真の場合:ログディレクトリのパスを表示します。
  • 条件が偽の場合:エラーメッセージを表示します。

実行権限の付与

user01@ubuntu:~$ chmod +x log-dir.sh

スクリプトの実行

user01@ubuntu:~$ ./log-dir.sh
[ERROR] ログディレクトリが見つかりません: /Logs

解説

  • /Logs ディレクトリが存在しないため、条件が偽となり else ブロックのエラーメッセージが表示されます。

例2:ファイルの読み取り・書き込みパーミッションの確認

 次のシェルスクリプトでは、指定したファイルが存在し、読み取りおよび書き込みパーミッションがあるかを確認します。

スクリプトの作成

user01@ubuntu:~$ nano check-permission.sh

check-permission.sh の内容

#!/bin/bash

filename="$1"

if [ -e "$filename" ]; then
    echo "ファイル '$filename' は存在します。"
    if [ -r "$filename" ]; then
        echo "読み取り可能です。"
    else
        echo "読み取り不可です。"
    fi
    if [ -w "$filename" ]; then
        echo "書き込み可能です。"
    else
        echo "書き込み不可です。"
    fi
else
    echo "ファイル '$filename' は存在しません。"
fi

解説

  • filename="$1":コマンドライン引数で指定されたファイル名を変数 filename に代入します。
  • if [ -e "$filename" ]; then-e 演算子でファイルの存在を確認します。
  • ファイルが存在する場合:
  • -r 演算子で読み取りパーミッションを確認します。
  • -w 演算子で書き込みパーミッションを確認します。
  • ファイルが存在しない場合:エラーメッセージを表示します。

実行権限の付与

user01@ubuntu:~$ chmod +x check-permission.sh

スクリプトの実行例

1.存在するファイルを指定

テスト用のファイルを作成します。

user01@ubuntu:~$ touch testfile.txt

パーミッションを設定します。

user01@ubuntu:~$ chmod 644 testfile.txt

スクリプトを実行します。

user01@ubuntu:~$ ./check-permission.sh testfile.txt
ファイル 'testfile.txt' は存在します。
読み取り可能です。
書き込み可能です。
  • testfile.txt は存在し、読み取り・書き込みパーミッションが与えられています。

2.存在しないファイルを指定

user01@ubuntu:~$ ./check-permission.sh nonexist.txt
ファイル 'nonexist.txt' は存在しません。

解説

  • nonexist.txt は存在しないため、存在しない旨のメッセージが表示されます。

3.読み取り不可のファイルを指定

パーミッションを変更します。

user01@ubuntu:~$ chmod 200 testfile.txt

スクリプトを再度実行します。

user01@ubuntu:~$ ./check-permission.sh testfile.txt
ファイル 'testfile.txt' は存在します。
読み取り不可です。
書き込み可能です。

解説

  • testfile.txt の読み取りパーミッションを外し、書き込みパーミッションのみ与えています。
  • スクリプトの結果、読み取り不可であることが確認できます。

不要になったファイルの削除

作成したシェルスクリプトとファイルを削除します。

user01@ubuntu:~$ rm log-dir.sh check-permission.sh testfile.txt

まとめ

  • ファイル属性の評価演算子を使用することで、ファイルやディレクトリの存在、種類、パーミッションなどを判定できます。
  • -e-d-f-r-w-x などの演算子を活用して、条件に応じた処理を実装できます。
  • 例1では、ログディレクトリの存在を確認し、存在しない場合にエラーメッセージを表示するスクリプトを作成しました。
  • 例2では、ファイルの存在と読み取り・書き込みパーミッションを確認するスクリプトを作成しました。

これらの機能を組み合わせることで、シェルスクリプトの柔軟性と信頼性を高めることができます。