csh - ファイルの存在やサイズで処理を分岐するには
if 文で (-operator filename) の形式でファイル照会ができる。
ファイル照会に使えるオペレーター
次のオペレーターがファイル照会に使える。
-r <filename> : ユーザーが読み取り権限を持っているか?
-w <filename> : ユーザーが書き込み権限を持っているか?
-x <filename> : ユーザーが実行権限(またはディレクトリの検索権限)を持っているか?
-e <filename> : ファイルが存在するか?
-o <filename> : ユーザーが所有するファイルか?
-z <filename> : 空のファイル(0 バイト)か?
-f <filename> : プレーンファイルか?
-d <filename> : ディレクトリか?
条件を満たす場合は true (1) を返す。
そうでなければ false (0) を返す。
もしも filename が存在しない、またはアクセスできない場合、false を返す。
例)ファイルまたはディレクトリが存在するか
if ( -e /path/to/file.txt ) then
echo "File exists."
endif
if ( -e /path/to/directory ) then
echo "Directory exists."
endif
例)プレーンファイルか
テキストファイルやバイナリーファイルといった通常のファイルなら true が返る。
if ( -f /path/to/file.txt ) then
echo "It is plain file."
endif
デバイスファイル等の特殊なファイルなら false が返る。
if ( -f /dev/kbd ) then
echo "It is plain file."
else
echo "not plain file." # こちらの分岐に入る
endif
ディレクトリには使えない。false が返る。
if ( -f /path/to/directory ) then
# true にはならない
endif
例)ディレクトリか
if ( -d /path/to/directory ) then
echo "It is directory."
endif
ファイルには使えない。false が返る。
if ( -d /path/to/file.txt ) then
# true にはならない
endif
例)空のファイルか
if ( -z /path/to/file.txt ) then
echo "It is empty file."
endif
例)空のファイルでないか
「ファイルが存在する AND 空のファイルでない」という条件で判定する。
if ( -e /path/to/file.txt && ! -z /path/to/file.txt ) then
# ファイルが空でないときに実行する処理
endif
もしも存在チェックをせず「! -z」だけにした場合、ファイルが存在しないときも処理されてしまう。
→ファイルが存在しないため false が返る。false が "!" で反転されて true になる。というわけ。
# ★★★これは悪い例★★★
if ( ! -z /path/to/notfound-file.txt ) then
# /path/to/notfound-file.txt が存在しないときも実行されてしまう!!!
endif
例)空のディレクトリか
-z ではディレクトリが空かどうかを判断できなかった。
if ( -z /path/to/directory ) then
# true にはならない
endif
代わりに `ls -1` で出力したファイルリストの行数を `wc -l` で数えることで判断する。
if ( -e /path/to/directory ) then
if ( `ls -1 /path/to/directory | wc -l` == 0 ) then
# ディレクトリが空のときの処理
echo "empty directory"
endif
endif
★注意事項★
次のように書くとディレクトリが存在しない場合に「No such file or directory」と出力されてしまう。
これは評価よりも前に、バッククォートで囲んだコマンドが展開されるからである。
# ★★★この書き方はやめよう★★★
if ( -e /path/to/notfound_directory && `ls -1 /path/to/notfound_directory | wc -l` == 0 ) then
echo 'empty directory'
endif