📌  相关文章
📜  Bash检查文件是否存在

📅  最后修改于: 2020-12-29 10:27:26             🧑  作者: Mango

Bash检查文件是否存在

大多数时候,我们可能会发现一种情况,我们可能需要执行一项操作来检查文件是否存在。

在Bash中,我们可以使用“测试命令”来检查文件是否存在并确定文件的类型。

以下是test命令的语法,我们可以使用以下任何命令:

test expression
[ expression ]
[[ expression ]]

我们需要使用单个方括号“ [”命令来使脚本可移植到所有POSIX Shell中。测试命令的升级版本包含双括号'[[',使用Bash,Zsh和Ksh作为默认shell的大多数现代系统均支持。

检查文件是否存在

在检查文件是否存在时,最常用的文件运算符是-e和-f。 “ -e”选项用于检查文件的类型是否存在,而“ -f”选项仅在文件是常规文件(而不是目录或设备)时才返回真值。

检查文件是否存在的最常见选项是将测试命令与“ if conditional statement”一起使用。

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

方法1

#!/bin/bash

File=read_file.txt
if test -f "$File"; then
echo "$File exist "
fi

方法2

#!/bin/bash

File=read_file.txt
if [ -f "$File" ]; then
echo "$File exist "
fi

方法3

#!/bin/bash

File=read_file.txt
if [[ -f "$File" ]]; then
echo "$File exist "
fi

输出量

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

read_file.txt exist

如果我们想执行一个操作来根据文件是否存在提供结果,则可以通过以下方式使用if / then构造:

#!/bin/bash

File=read_file.txt
if [ -f "$File" ]; then
echo "$File exist"
else
echo "$File does not exist"
fi

输出量

read_file.txt exist

我们也可以使用不带if语句的test命令。我们可以使用以下任何一种方法:

方法1

#!/bin/bash

File=read_file.txt
test -f read_file.txt && echo "$File exist"

方法2

#!/bin/bash

File=read_file.txt
[ -f read_file.txt ] && echo "$File exist"

方法3

#!/bin/bash

File=read_file.txt
[[ -f read_file.txt ]] && echo "$File exist"

输出量

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

read_file.txt exist

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

#!/bin/bash

File=read_file.txt
[ -f read_file.txt ] && { echo "$File exist"; echo "Task Completed"; }

与&&不同,||之后的语句仅当测试命令的退出状态为“假”时才执行运算符。

#!/bin/bash

File=read_file.txt

[ -f read_file.txt ] && echo "$File exist" || echo "$File does not exist"

输出量

read_file.txt exist

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

检查目录是否存在

运算符“ -d”使我们能够测试文件是否为目录。

以下是检查“ Javatpoint”目录是否存在的方法:

方法1

#!/bin/bash

File=Javatpoint
if [ -d "$File" ]; then
echo "$File is a directory"
fi

方法2

#!/bin/bash

File=Javatpoint
[ -d "$File" ] && echo "$File is a directory"

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

输出量

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

Javatpoint is a directory

检查是否不存在文件

可以使用感叹号(!-logical NOT运算符)来否定测试表达式。查看以下示例:

#!/bin/bash

File=missing_read_file.txt
if [ ! -f "$File" ]; then
echo "$File does not exist"
fi

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

#!/bin/bash

File=missing_read_file.txt
[ ! -f "$File" ] && echo "$File unavailable"

输出量

missing_read_file.txt unavailable

文件测试操作员

测试命令包括以下文件运算符,这些文件运算符使我们可以测试特定类型的文件:

-b FileReturns ‘True’ if the FILE exists as a block special file.
-c FileReturns ‘True’ if the FILE exists as a special character file.
-d FileReturns ‘True’ if the FILE exists as a directory.
-e FileReturns ‘True’ if the FILE exists as a file, regardless of type (node, directory, socket, etc.).
-f FileReturns ‘True’ if the FILE exists as a regular file (not a directory or device).
-G FileReturns ‘True’ if the FILE exists and contains the same group as the user is running the command.
-h FileReturns ‘True’ if the FILE exists as a symbolic link.
-g FileReturns ‘True’ if the FILE exists and contains set-group-id (sgid) flag set.
-k FileReturns ‘True’ if the FILE exists and contains a sticky bit flag set.
-L FileReturns ‘True’ if the FILE exists as a symbolic link.
-O FileReturns ‘True’ if the FILE exists and is owned by the user who is running the command.
-p FileReturns ‘True’ if the FILE exists as a pipe.
-r FileReturns ‘True’ if the FILE exists as a readable file.
-S FileReturns ‘True’ if the FILE exists as a socket.
-s FileReturns ‘True’ if the FILE exists and has nonzero size.
-u FileReturns ‘True’ if the FILE exists, and set-user-id (suid) flag is set.
-w FileReturns ‘True’ if the FILE exists as a writable file.
-x FileReturns ‘True’ if the FILE exists as an executable file.