statまたはbashを使用してFILENAMEがファイルを参照しているかどうかを確認する方法

statまたはbashを使用してFILENAMEがファイルを参照しているかどうかを確認する方法

このコマンドは、ディレクトリの代わりにファイルが参照されているかどうかを確認する直接的な方法をstat提供しますか、それとも提供しますか?bashFILENAME

bashand を使用すると、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 [)セッションとシェルセッションの両方にhelp test書き込まれますbash。両方のテスト標準テストすべてのPOSIXtest[ユーティリティはこれを実行できます。

name=something

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

OpenBSDでも同じことが行われます(次のコードは、呼び出し前にファイルシステムに名前があることを確認するためにstat標準テストも使用します)。-estat

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

最後のテストのパターンは文字列sumregular 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 

関連情報