ログってなんぼ

日々のメモです

testコマンドのオプションを使い分けてファイルの状態をチェックするメモ

ファイルの評価に関して自分的に頻度の高いオプションをまとめてみました

option 説明
-e ファイルが存在すればtrue
-f ファイルが存在し、それが通常のファイルであればtrue
-r ファイルが存在し、読み取り可能であればtrue
-w ファイルが存在し、書き込み可能であればtrue
-x ファイルが存在し、実行可能であればtrue
-d ファイルが存在し、ディレクトリであればtrue
-b ファイルが存在し、ブロックデバイススペシャルファイルであればtrue
-c ファイルが存在し、キャラクタデバイススペシャルファイルであればtrue
-s ファイルが存在し、サイズが0より大きければtrue
-L ファイルが存在し、シンボリックリンクであればtrue

通常で無いファイルとは

デバイススペシャルファイル - UnixClassWiki

確認

$ [ -e Gemfile ]; echo $?
0
$ [ -f /dev/disk1 ]; echo $?
1

true(0) false(1) となりますが、あえて冗長に書いてtrue/falseがわかりやすいようにテストしてみました。

下記にいくつかのオプションを抜粋しておさらい的に実行したメモを貼り付けておきます。

# 存在するがブロックデバイススペシャルファイルなのでfalse
$ if [ -f /dev/disk1 ]; then echo "true"; else echo "false";fi
false

# -eで評価すれば種類は問わないのでtrue
$ if [ -e /dev/disk1 ]; then echo "true"; else echo "false";fi
true

# 存在し、通常のファイル
$ if [ -f ./Gemfile ]; then echo "true"; else echo "false";fi
true

# 種類は問わない
$ if [ -e ./Gemfile ]; then echo "true"; else echo "false";fi
true

# 実行可能ではないためfalse
$ if [ -x ./deploy.sh ]; then echo "true"; else echo "false";fi
false

# 現ユーザーに実行権を付与するとtrueとなる
$ chmod +x deploy.sh
$ if [ -x ./deploy.sh ]; then echo "true"; else echo "false";fi
true

# ディレクトリなのでtrue
$ if [ -d app ]; then echo "true"; else echo "false";fi
true
# ディレクトリじゃないのでfalse
$ if [ -d Gemfile ]; then echo "true"; else echo "false";fi
false

# ブロックスペシャルデバイスファイルなのでtrue
$ if [ -b /dev/disk1 ]; then echo "true"; else echo "false";fi
true

# ttyはキャラクタデバイススペシャルファイルなのでfalse
$ if [ -b /dev/tty ]; then echo "true"; else echo "false";fi

# -cで評価するとtrue
false
$ if [ -c /dev/tty ]; then echo "true"; else echo "false";fi
true

# 疑似デバイスは -c でtrue
$ if [ -f /dev/null ]; then echo "true"; else echo "false";fi
false
$ if [ -b /dev/null ]; then echo "true"; else echo "false";fi
false
$ if [ -c /dev/null ]; then echo "true"; else echo "false";fi
true

# デバイススペシャルファイルはサイズ0扱い
$ if [ -s ./deploy.sh ]; then echo "true"; else echo "false";fi
true
$ if [ -s /dev/disk1 ]; then echo "true"; else echo "false";fi
false
$ if [ -s /dev/null ]; then echo "true"; else echo "false";fi
false
$ if [ -s /dev/tty ]; then echo "true"; else echo "false";fi
false

もっと詳しく

https://linuxjm.osdn.jp/html/GNU_sh-utils/man1/test.1.htmllinuxjm.osdn.jp

http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230901/itpro.nikkeibp.co.jp