シェルスクリプト内にディレクトリが存在するかどうかを調べる

シェルスクリプト内で、ディレクトリが存在するかどうかを確認するために使用できるコマンドは?

ソリューション

シェルスクリプトでディレクトリが存在するかどうかを確認するには、次のようにします。

if [ -d "$DIRECTORY" ]; then
  # Control will enter here if $DIRECTORY exists.
fi

また、ディレクトリが存在しないかどうかを確認するには

if [ ! -d "$DIRECTORY" ]; then
  # Control will enter here if $DIRECTORY doesn't exist.
fi

しかし、Jon Ericsonが指摘しているように、ディレクトリへのシンボリックリンクもこのチェックを通過することを考慮しないと、その後のコマンドが意図したとおりに動作しないことがあります。 例)これを実行すると

ln -s "$ACTUAL_DIR" "$SYMLINK"
if [ -d "$SYMLINK" ]; then 
  rmdir "$SYMLINK" 
fi

を実行すると、エラーメッセージが表示されます。

rmdir: failed to remove `symlink': Not a directory

そのため、後続のコマンドがディレクトリを想定している場合には、シンボリックリンクは別の方法で扱わなければならないことがあります。

if [ -d "$LINK_OR_DIR" ]; then 
  if [ -L "$LINK_OR_DIR" ]; then
    # It is a symlink!
    # Symbolic link specific commands go here.
    rm "$LINK_OR_DIR"
  else
    # It's a directory!
    # Directory command goes here.
    rmdir "$LINK_OR_DIR"
  fi
fi

この理由については、8jean氏が別の回答で説明しています。

変数にスペースやその他の異常な文字が含まれていると、おそらくスクリプトが失敗します。

解説 (12)

なお、-dテストでは、意外な結果が出ることがあります。

$ ln -s tmp/ t
$ if [ -d t ]; then rmdir t; fi
rmdir: directory "t": Path component not a directory

ファイルを作成します。"When is a directory not a directory?" その答えは"When it's a symlink to a directory." もう少し徹底したテストを。

if [ -d t ]; then 
   if [ -L t ]; then 
      rm t
   else 
      rmdir t
   fi
fi

BashのマニュアルのBashの条件式や[[内蔵コマンド](https://www.gnu.org/software/bash/manual/bash.html#index-_005b)や[`[[`複合コマンド]](https://www.gnu.org/software/bash/manual/bash.html#index-_005b_005b)に詳しい情報があります

解説 (1)

find`を使ったさらなる機能

  • サブディレクトリ内のフォルダの存在を確認します。

      found=`find -type d -name "myDirectory"`
      もし [ -n "$found"] であれば
      とすると
          # 変数'found'には、"myDirectory "が存在するフルパスが格納されます。
          # "myDirectory "という名前のフォルダが複数ある場合は、複数行になることがあります。
      fi
  • カレントディレクトリ内のパターンに基づいて、1つまたは複数のフォルダの存在を確認します。

      found=`find -maxdepth 1 -type d -name "my*"`
      if [ -n "$found"].
      その場合
          # 変数 'found' には、フォルダ "my*" が見つかったフルパスが格納されます。
      fi
  • 両方の組み合わせ。次の例では、カレント・ディレクトリにフォルダが存在するかどうかをチェックします。

      found=`find -maxdepth 1 -type d -name "myDirectory"`
      if [ -n "$found"].
      その場合
          # 変数 'found' が空ではない => "myDirectory"` が存在する。
      fi
解説 (1)