Files

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

  • December 1, 2019

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

另請參閱此相關問題。

如果給定的-f名稱是正常文件的名稱或到正常文件的符號連結,則測試將為真。-h如果給定名稱是符號連結的名稱,則測試將為真。這在man test(或man [)和shell 會話help test中都有記錄。bash這兩個測試都是任何 POSIX和實用程序都可以實現的標準測試。test``[

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 fileregular empty file.

引用自:https://unix.stackexchange.com/questions/554932