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


この記事が気に入ったらサポートをしてみませんか?