该stat
命令是否提供或确实bash
提供了一种直接的方法来检查是否FILENAME
引用了文件而不是目录?
使用bash
和stat
,这是我丑陋的解决方案:
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