Bash 检查文件是否存在

2024 年 8 月 29 日 | 4 分钟阅读

大多数情况下,我们可能会遇到需要执行操作以检查文件是否存在的场景。

在 Bash 中,我们可以使用 'test command' 来检查文件是否存在并确定文件的类型。

以下是 test 命令的语法,我们可以使用这些命令中的任何一个

我们需要使用单括号 '[' 命令来使我们的脚本可移植到所有 POSIX shell。升级版本的 test 命令包含双括号 '[[',它在大多数使用 Bash、Zsh 和 Ksh 作为默认 shell 的现代系统上都支持。

检查文件是否存在

在检查文件是否存在时,最常用的文件操作符是 -e 和 -f。'-e' 选项用于检查文件是否存在,无论类型如何,而 '-f' 选项仅在文件是常规文件(不是目录或设备)时才返回真值。

检查文件是否存在的最常见方法是使用带有 'if 条件语句' 的 test 命令。

以下是检查 'read_file.txt' 文件是否存在的示例

方法 1

方法 2

方法 3

输出

所有三种方法的输出将如下所示,因为我们在目录中有一个文件 (read_file.txt)

read_file.txt exist

如果我们想执行一个基于文件是否存在提供结果的操作,我们可以按以下方式使用 if/then 构造

示例

输出

read_file.txt exist

我们也可以在没有 if 语句的情况下使用 test 命令。我们可以使用以下任何一种方法

方法 1

方法 2

方法 3

输出

所有三种方法的输出将如下所示,因为我们在目录中有一个文件 (read_file.txt)

read_file.txt exist

如果在 && 运算符之后要运行多个命令,则将这些命令括在用分号 (;) 或 AND (&&) 分隔的花括号中,即

示例

与 && 不同,只有在 test 命令的退出状态为“false”时,才会执行 || 运算符之后的语句。

示例

输出

read_file.txt exist

这些是 Bash 中常用的检查文件是否存在的方法。

检查目录是否存在

运算符 '-d' 允许我们测试文件是否为目录。

以下是检查 'Javatpoint' 目录是否存在的方法

方法 1

方法 2

注意:我们也可以使用双括号 '[[' 代替单括号 '['。

输出

以上两种方法的输出都将如下所示,因为我们在指定位置有一个目录(名为 Javatpoint)

Javatpoint is a directory

检查文件是否不存在

可以使用感叹号 (! - 逻辑非运算符) 否定测试表达式。查看以下示例

示例

上面的脚本也可以写成如下

输出

missing_read_file.txt unavailable

文件测试操作符

test 命令包含以下文件操作符,这些操作符允许我们测试特定类型的文件

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