如何检查Bash中是否存在文件或目录

编写Shell脚本时,很多时候,您可能会发现自己需要根据文件是否存在执行操作。

在Bash中,可以使用test命令检查文件是否存在并确定文件的类型。

test命令采用以下语法格式之一:

test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]

如果您希望脚本具有可移植性,则应该使用旧测试 [ command, which is available on all POSIX shells. The new upgraded version of the test command [[ (double brackets) is supported on most modern systems using Bash, Zsh, and Ksh as a default shell.

Check if File Exists #

When checking if a file exists, the most commonly used FILE operators are -e and -f. The first one will check whether a file exists regardless of the type, while the second one will return true only if the FILE is a regular file (not a directory or a device).

The most readable option when checking whether a file exists or not is to use the test command in combination with the if statement . Any of the snippets below will check whether the /etc/resolv.conf file exists:

FILE=/etc/resolv.conf
if test -f "$FILE"; then
    echo "$FILE exists."
fi
FILE=/etc/resolv.conf
if [ -f "$FILE" ]; 然后回显“ $ FILE存在。” 科幻
FILE=/etc/resolv.conf
if [[ -f "$FILE" ]]; then
    echo "$FILE exists."
fi

如果要基于文件是否存在执行其他操作,只需使用if / then构造:

FILE=/etc/resolv.conf
if [ -f "$FILE" ]; then
    echo "$FILE exists."
else 
    echo "$FILE does not exist."
fi

处理名称中包含空格的文件时,请始终使用双引号来避免出现问题。

您也可以使用不带if语句的test命令。 后面的命令 && 仅当测试命令的退出状态为true时,才执行操作符;

test -f /etc/resolv.conf && echo "$FILE exists."
[ -f /etc/resolv.conf ] && echo "$FILE exists."
[[ -f /etc/resolv.conf ]] && echo "$FILE exists."

如果要在运行后执行一系列命令 && 运算符只需将命令括在大括号中,并用 ; 要么 &&

[ -f /etc/resolv.conf ] && { echo "$FILE exist."; cp "$FILE" /tmp/; }

对面 &&|| 仅当测试命令的退出状态为 false

[ -f /etc/resolv.conf ] && echo "$FILE exist." || echo "$FILE does not exist."

检查目录是否存在

经营者 -d 允许您测试文件是否为目录。

例如检查是否 /etc/docker 您将使用的目录存在:

FILE=/etc/docker
if [ -d "$FILE" ]; then
    echo "$FILE is a directory."
fi
[ -d /etc/docker ] && echo "$FILE is a directory."

您也可以使用双括号 [[ instead of a single one [.

Check if File does Not Exist #

Similar to many other languages, the test expression can be negated using the ! (exclamation mark) logical not operator:

FILE=/etc/docker
if [ ! -f "$FILE" ]; 然后回显“ $ FILE不存在”。 科幻

与上述相同:

[ ! -f /etc/docker ] && echo "$FILE does not exist."

检查是否存在多个文件

可以使用复杂的嵌套if / else构造代替 -a (要么 &&[[)以测试是否存在多个文件:

if [ -f /etc/resolv.conf -a -f /etc/hosts ]; then
    echo "Both files exist."
fi
if [[ -f /etc/resolv.conf && -f /etc/hosts ]]; then
    echo "Both files exist."
fi

不使用IF语句的等效变体:

[ -f /etc/resolv.conf -a -f /etc/hosts ] && echo "Both files exist."
[[ -f /etc/resolv.conf && -f /etc/hosts ]] && echo "Both files exist."

文件测试操作员

test命令包括以下FILE运算符,可让您测试特定类型的文件:

  • -b FILE -如果FILE存在并且是特殊的块文件,则为true。
  • -c FILE -如果FILE存在并且是特殊字符文件,则为true。
  • -d FILE -如果FILE存在并且是目录,则为true。
  • -e FILE -如果FILE存在且是文件,则与True无关,而与类型(节点,目录,套接字等)无关。
  • -f FILE -如果FILE存在并且是常规文件(不是目录或设备),则为true。
  • -G FILE -如果FILE存在并且与运行命令的用户具有相同的组,则为true。
  • -h FILE -如果FILE存在并且是符号链接,则为true。
  • -g FILE -如果FILE存在且具有set-group-id(sgid)标志集。
  • -k FILE -如果FILE存在并且设置了粘性位标志,则为true。
  • -L FILE -如果FILE存在并且是符号链接,则为true。
  • -O FILE -如果FILE存在并且由运行命令的用户拥有,则为True。
  • -p FILE -如果FILE存在并且是管道,则为true。
  • -r FILE -如果FILE存在且可读,则为true。
  • -S FILE -如果FILE存在并且是套接字,则为true。
  • -s FILE -如果FILE存在且大小非零,则为true。
  • -u FILE -如果FILE存在,则返回true,并设置用户ID(suid)标志已设置。
  • -w FILE -如果FILE存在且可写,则为true。
  • -x FILE -如果FILE存在且可执行,则为true。

结论#

在本指南中,我们向您展示了如何检查Bash中是否存在文件或目录。

如果您有任何疑问或反馈,请随时发表评论。

bash终端

Sidebar