web-dev-qa-db-ja.com

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

参照 この関連する質問。

3
thb

-fテストは、指定された名前が通常のファイルの名前または通常のファイルへのシンボリックリンクである場合にtrueになります。 -hテストは、指定された名前がシンボリックリンクの名前である場合にtrueになります。これは、man test(またはman [)と、bashシェルセッションのhelp testの両方に記載されています。どちらのテストも 標準テスト であり、POSIX testおよび[ユーティリティが実装します。

name=something

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

OpenBSDでstatを使用するのと同じこと(次のコードも、statを呼び出す前にファイルシステムに名前が存在することを確認するために標準の-eテストを使用しています):

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の両方に一致します。

6
Kusalananda

要求された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 
3
ctrl-alt-delor