シェルスクリプトでファイルの存在を確認する方法

2017年9月29日

シェルスクリプト(Bashスクリプト)で通常ファイルが存在した場合のみコマンドを実行するには、以下のように書きます。

#!/bin/bash

if [[ -f ~/path/to/file ]]; then
  # 実行する処理、以下は例
  ls -l ~/path/to/file
fi

通常ファイル以外の広義のファイル(ディレクトリやソケットなど)の場合は、「-f」で調べても「」となり、コマンドが実行されません。
ファイルタイプにかかわらず、存在すればコマンド実行する場合は「-e」を用います。

#!/bin/bash

if [[ -e ~/path/to/file ]]; then
  # 実行する処理、以下は例
  ls -l ~/path/to/file
fi

存在しない場合にコマンドを実行するには、以下のように書きます。

#!/bin/bash

if [[ ! -e ~/path/to/file ]]; then
  # 実行する処理、以下は例
  touch ~/path/to/file
fi

以下は、Bashのマニュアルページに記載されている、ファイル存在に関する条件式です。これらを組み合わせることで、ファイルの存在、非存在、種類に応じて処理を変えることができます。

-a file
file が存在すれば真となります。

-b file
file が存在し、かつブロック特殊ファイルならば真となります。

-c file
file が存在し、かつキャラクター特殊ファイルならば真となります。

-d file
file が存在し、かつディレクトリならば真となります。

-e file
file が存在すれば真となります。

-f file
file が存在し、かつ通常ファイルならば真となります。

-g file
file が存在し、かつ set-group-id されていれば真となります。

-h file
file が存在し、かつシンボリックリンクならば真となります。

-k file
file が存在し、かつ ``sticky'' ビットが設定されていれば真となります。

-p file
file が存在し、かつ名前付きパイプ (FIFO) ならば真となります。

-r file
file が存在し、かつ読み込み可能ならば真となります。

-s file
file が存在し、かつそのサイズが 0 より大きければ真となります。

-u file
file が存在し、 かつ set-user-id ビットが設定されていれば真となります。

-w file
file が存在し、かつ書き込み可能ならば真となります。

-x file
file が存在し、かつ実行可能ならば真となります。

-G file
file が存在し、かつ (実行中のシェルの) 実効グループ ID に所有されていれば真となります。

-L file
file が存在し、かつシンボリックリンクならば真となります。

-N file
file が存在し、 かつ前回読み込まれた以降に修正されていれば真となります。

-O file
file が存在し、かつ (実行中のシェルの) 実効ユーザ ID に所有されていれば真となります。

-S file
file が存在し、かつソケットならば真となります。