このコマンドは、ディレクトリの代わりにファイルが参照されているかどうかを確認する直接的な方法をstat
提供しますか、それとも提供しますか?bash
FILENAME
bash
and を使用すると、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
標準テストも使用します)。-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
最後のテストのパターンは文字列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