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

シェル

シェルスクリプト(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 が存在し、かつソケットならば真となります。
シェル初心者向け
\シェアお願いします/
LFI

コメント

  1. 師子乃 より:

    初めまして、シェルスクリプト、勉強させていただきます!

  2. ぺけぽん より:

    ブラケットは二重にする必要はないかと思います。( “/usr/bin/[” コマンドを実行しているだけなので)
    if [ -f ~/path/to/file ] などでOKです。

    • LinTaro より:

      二重ブラケットを用いたほうが高速で便利なので、そちらを紹介しています。
      [ ] と書くと /usr/bin/[ が実行されますが、[[ ]] と書くとBashによって処理されます。
      さらに[[ ]] は [ ] と異なり、値が空の変数を ” で囲わなくてもエラーにならなかったり、&& や ||が使えたり、=~ で正規表現にマッチするかどうかを判定したりできます。

      なので、Bashスクリプトでは [ ] ではなく [[ ]] を用いることをお勧めします。

      • ぺけぽん より:

        [[ はbash内蔵の機能なんですね。
        いつも,shのことばかり意識していたので,
        [[ のことはよく理解していませんでした。
        勉強不足で見当違いなことを申し上げたこと,お詫びいたします。

タイトルとURLをコピーしました