在带有 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
测试运算符 onbash
检查目录是否存在:
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 shell 中的语法是:
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
存在就会成功,并且之后可以确定是一个目录,即使它已经存在。
再说一遍,您可能不需要事先进行测试。