如何使用 Bash 检查一个或多个文件(目录 /ies)是否存在?

如何使用 Bash 检查一个或多个文件(目录 /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测试运算符 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

有关文件测试运算符的更多详细信息,请参见bashhttps://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存在就会成功,并且之后可以确定是一个目录,即使它已经存在。

再说一遍,您可能不需要事先进行测试。

相关内容