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
参照 この関連する質問。
-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 file
とregular empty file
の両方に一致します。
要求された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