Bashを使用して1つ以上のファイル(ディレクトリ/ ies)が存在するかどうかを確認するには?

Bashを使用して1つ以上のファイル(ディレクトリ/ ies)が存在するかどうかを確認するには?

Bash 3.2.52(2)がインストールされているCentOSでは、以前に存在しなかったことを確認した後、両方のバックアップディレクトリを作成してみました。

rm -rf "${general_backups_dir}"
rm -rf "${specific_backups_dir}"
mkdir -p "${general_backups_dir}"
mkdir -p "${specific_backups_dir}"

タスクをテストするにはls -laデバッグモードで作業できますが、両方のディレクトリの存在を示すより正確な方法が必要です。


これはうまくいきません:

ls -la ${HOME} | grep "${general_backups_dir}"
ls -la ${HOME} | grep "${specific_backups_dir}"

ところで、私は(擬似コード)のような一行の操作を好みます。

ls -la ${HOME} | grep *EXPRESSION_INCLUDED_IN_BOTH_DIRECTORY_NAMES*

答え1

-d次に、テスト演算子を使用してディレクトリが存在することを確認しますbash

if [[ -d testdir ]]; then echo "testdir already exists"; else mkdir testdir; fi

"testdir"を変数に置き換えることができます。安全のために変数を二重引用符で囲んでください。

if [[ -d "$backup_dir"]]; then echo "$backup_dir already exists"; else mkdir "$backup_dir"; fi

ネストされたディレクトリ(dir1 / dir2 / dir3など)の場合は、代わりにを使用してくださいmkdir -p

ファイルテスト演算子の詳細については、次を参照してくださいbashhttps://tldp.org/LDP/abs/html/fto.html

答え2

POSIXシェルにファイルがあるかどうかを確認する構文は次のとおりです。

if [ -e "$file" ] || [ -L "$file" ]; then
  printf '%s\n' "The $file file exists"
  if [ -d "$file" ]; then
    if [ -L "$file" ]; then
      echo "and it's a symlink to a directory"
    else
      echo "and it's a directory"
    fi
  else
    echo "and it's not a directory (or I couldn't tell if it was)"
  fi
else
  printf '%s\n' "$file does not appear to exist"
fi

したがって、重要な状況で実行したいコードをここに挿入できます。

-f今注目してください。

rm -rf -- "$file" || exit

$file辞書に存在しない場所では成功します。失敗した終了ステータスが返される唯一のケースrmは、ファイルがまだ存在する場合です(ファイルは存在しますが削除できません)。

$fileしたがって、存在するが型ではない場合に対処する必要がない限り、事前に確認する必要はありません。目次

そして:

mkdir -p -- "$file" || exit

存在する限り成功$fileし、すでに存在していてもディレクトリとして判断できます。

繰り返しますが、事前にテストする必要はありません。

関連情報