※ 2015-06-27 sat 内容を修正・追加しました。
ちょっと,bashの条件判定testのオプションを勉強していて,ファイルの判定で紛らわしいものがあったので確認してみました。
testコマンドオプションの比較
- ファイルの存在を判定する:-e
- "通常"ファイルを判定する:-f
- ファイルサイズ0を判定する:-s(サイズが0より大きければTRUE)
test -eオプション
-eオプションは,単純に,lsしたときに表示されれば"TRUE(0)"判定されるんだと思います。
※ testはTRUEなら0,FALSEなら1を返します。
test -fオプション
-fオプションは、通常ファイルの判定。
キーになるのは"通常"ファイルというもの。
通常じゃないファイルとは?
いわゆるスペシャルファイルというヤツです。
たとえば,/dev/sda1 のようなデバイスファイル。
(/dev/random のような疑似デバイスも含む)
そのため,/dev/sda1は,-eではTRUE, -fではFALSE, -sではFALSEとなります。
(つまり,デバイスファイルはサイズ0判定。。)
test -sオプション
-sオプションは,ファイルサイズが0より大きければ。。
つまり,touchされただけのファイルでは"FALSE(1)",
"通常の"ファイルやシンボリックリンクは"TRUE(0)"です。
上記の事をまとめた表
ファイルの種類 | test -e | test -f | test -s |
普通のテキストファイル | TRUE | TRUE | TRUE |
サイズ0のファイル | TRUE | TRUE | FALSE |
シンボリックリンク | TRUE | TRUE | TRUE |
デバイスファイル | TRUE | FALSE | FALSE |
実際のコマンド結果
- 普通のテキストファイルで確認 (0がTrue, 1がFalseです。)
$ echo hoge > textfile.txt $ test -e ./textfile.txt ; echo $? 0 $ test -f ./textfile.txt ; echo $? 0 $ test -s ./textfile.txt ; echo $? 0
- touch しただけのサイズ0のファイルで確認 (0がTrue, 1がFalseです。)
$ touch size_zero_file $ test -e ./size_zero_file ; echo $? 0 $ test -f ./size_zero_file ; echo $? 0 $ test -s ./size_zero_file ; echo $? 1
- シンボリックリンクで確認 (0がTrue, 1がFalseです。)
$ ln -s ./textfile.txt symboliclink $ test -e ./symboliclink ; echo $? 0 $ test -f ./symboliclink ; echo $? 0 $ test -s ./symboliclink ; echo $? 0
- デバイスファイル /dev/null で確認 (0がTrue, 1がFalse です。)
$ test -e /dev/null ; echo $? 0 $ test -f /dev/null ; echo $? 1 $ test -s /dev/null ; echo $? 1