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
。
ファイルテスト演算子の詳細については、次を参照してくださいbash
。https://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
し、すでに存在していてもディレクトリとして判断できます。
繰り返しますが、事前にテストする必要はありません。