如何使用 stat 或 bash 检查 FILENAME 是否引用文件

如何使用 stat 或 bash 检查 FILENAME 是否引用文件

stat命令是否提供或确实bash提供了一种直接的方法来检查是否FILENAME引用了文件而不是目录?

使用bashstat,这是我丑陋的解决方案:

if RESPONSE="$(LC_ALL=C stat -c%F FILENAME)"\
 && [ "$RESPONSE" = 'regular file'\
 -o "$RESPONSE" = 'regular empty file' ]
then
    # do something ...
fi

也可以看看这个相关问题。

答案1

-f如果给定名称是常规文件的名称或常规文件的符号链接,则测试为真。-h如果给定名称是符号链接的名称,则测试为真。这在man test(或man [) 和 shell 会话中help test都有记录bash。两项测试都是标准测试任何 POSIXtest[实用程序都可以实现。

name=something

if [ -f "$name" ] && ! [ -h "$name" ]; then
    # "$name" refers to a regular file
fi

在 OpenBSD 上使用同样的事情stat(以下代码也使用标准-e测试只是为了确保在调用之前该名称存在于文件系统中stat):

name=something

if [ -e "$name" ] && [ "$(stat -f %Hp "$name")" = "10" ]; then
    # "$name" refers to a regular file
fi

(文件类型10表示常规文件)。

如果使用 GNU stat

name=something

if [ -e "$name" ] && [[ $(stat --printf=%F "$name") == "regular"*"file" ]]; then
    # "$name" refers to a regular file
fi

最后一个测试中的模式与字符串regular file和相匹配regular empty file

答案2

stat所要求的解决方案。

stat --printf "%F" file-name

请参阅手册(摘录如下)

       -c  --format=FORMAT
              use the specified FORMAT instead of the default; output a newline after each use of FORMAT

       --printf=FORMAT
              like  --format,  but interpret backslash escapes, and do not output a mandatory trailing newline;
              if you want a newline, include \n in FORMAT

The valid format sequences for files (without --file-system):

       %F     file type

GNU coreutils 8.30 

相关内容