该stat命令是否提供或确实bash提供了一种直接的方法来检查是否FILENAME引用了文件而不是目录?
使用bashand stat,这是我丑陋的解决方案:
if RESPONSE="$(LC_ALL=C stat -c%F FILENAME)"\
&& [ "$RESPONSE" = 'regular file'\
-o "$RESPONSE" = 'regular empty file' ]
then
# do something ...
fi
Run Code Online (Sandbox Code Playgroud)
另请参阅此相关问题。
该-f如果给定的名字是一个普通文件或一个符号链接到一个普通文件的名称测试将是真实的。该-h如果给定的名字是一个符号链接的名称测试将是真实的。这两个文件man test(或man [),并help test在bashshell会话。这两个测试都是任何 POSIX和实用程序都可以实现的标准测试。test[
name=something
if [ -f "$name" ] && ! [ -h "$name" ]; then
# "$name" refers to a regular file
fi
Run Code Online (Sandbox Code Playgroud)
stat在 OpenBSD 上使用相同的东西(以下代码也使用标准-e测试,只是为了确保在调用之前名称存在于文件系统中stat):
name=something
if [ -e "$name" ] && [ "$(stat -f %Hp "$name")" = "10" ]; then
# "$name" refers to a regular file
fi
Run Code Online (Sandbox Code Playgroud)
(文件类型为10表示常规文件)。
如果使用 GNU stat:
name=something
if [ -e "$name" ] && [[ $(stat --printf=%F "$name") == "regular"*"file" ]]; then
# "$name" refers to a regular file
fi
Run Code Online (Sandbox Code Playgroud)
最后一个测试中的模式与字符串regular file和regular empty file.