testコマンドの似たようなオプションに「f」と「e」があります。
調べたところ、以下の違いがあるようです。
-f:file が普通のファイルならば真となる。
-e:file が存在するならば真となる。
この「普通のファイル」とはどういったものでしょうか。
分かる方おりましたらよろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答5件
0
「普通のファイル」というのは、"regular file" の訳で、下記のリストのうち、ディレクトリーと特殊ファイル以外のファイルのことを指します。
「通常のファイル」とも表記されることがあります。
これらのファイルは、ls -l
コマンドで表示したときに、一番左の1桁に属性が表示されます。
■リスト
d : ディレクトリー b : ブロックスペシャルファイル/ブロック型特殊ファイル c : キャラクタースペシャルファイル/文字型特殊ファイル l : シンボリックリンク p : 名前つきパイプ/FIFO特殊ファイル s : ソケット - : 通常のファイル
投稿2015/11/09 14:57
総合スコア9396
0
いくつか試した所,少なくとも/dev/null,/dev/sdaなどデバイスファイル,ソケット・パイプ・イベントポールファイルなどはRegular Fileではないようです.
メモリ上でのみ存在するprocファイルシステムであっても,殆どのエントリがRegular Fileだったので,かなり範囲は広いようです.
実際は,testコマンドが判断しているというより,statシステムコールでS_IFREGのビットが立っているかをしらべているだけです.
詳しくはman 2 statのEXAMPLEを御覧ください.
bash
1strace -e stat test -f [file]
とするとst_mode=○○と出ますので,これにS_IFREGが含まれていればRegular Fileです.
Linuxが何にS_IFREGのフラグを立てているのかは,Linux Cross Referenceから確認できます.
投稿2015/11/09 15:24
総合スコア751
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
unix でのファイルの種類については、次のページを参照してください。
(2008 年のページですが、概念に変化は無いので、このページの情報で十分です)
...
普通のファイル(regular file)
最も一般的なのは、内容がそのまま記録されているファイルです。このようなファイルのことを、regular file(訳は「普通のファイル」?)あるいはnormal file(これもやっぱり「普通のファイル」?)と言います。
...
direcoty や シンボリックリンク は 普通のファイル ではありません。
google で "linux regular file" を検索してみてください。
投稿2015/11/09 14:52
編集2015/11/09 21:38総合スコア22328
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
普通のファイルでないものは、ディレクトリーとか、FIFO(名前付きパイプ)、デバイス などですね。
追記:
man test にそのままありますね。
ファイル形式のテスト -b file file が存在し、ブロックスペシャルファイルであれば真。 -c file file が存在し、キャラクタスペシャルファイルであれば真。 -d file file が存在し、ディレクトリであれば真。 -f file file が存在し、通常ファイル (regular file) であれば真。 -h file -L file file が存在し、シンボリックリンクであれば真。 -p file file が存在し、名前付きパイプ (named pipe) であれば真。 -S file file が存在し、ソケットであれば真。
ファイル=通常ファイル、ブロックスペシャルファイル、、キャラクタスペシャルファイル、ディレクトリ、シンボリックリンク、名前付きパイプ、ソケット
つまり、-f
で真となるのは「普通のファイル」としか言いようが無い。
-e
は、上記すべてのファイルで真となります。
投稿2015/11/09 14:51
編集2015/11/09 15:00総合スコア86281
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
fifoは普通のファイルではないようです。
shell
1vi test.sh 2--- 3#!/bin/sh 4 5if [ -f a ];then 6 echo 'f OK' 7fi 8 9if [ -e a ];then 10 echo 'e OK' 11fi 12--- 13 14mkfifo a 15sh test.sh 16e OK
shell
1% stat a 2 File: `a' 3 Size: 0 Blocks: 0 IO Block: 4096 fifo 4Device: fc00h/64512d Inode: 4194321 Links: 1 5Access: (0644/prw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) 6Access: 2015-11-09 23:48:36.163673365 +0900 7Modify: 2015-11-09 23:48:36.163673365 +0900 8Change: 2015-11-09 23:48:36.163673365 +0900 9 Birth: - 10 11% touch b 12% stat b 13 File: `b' 14 Size: 0 Blocks: 0 IO Block: 4096 通常の空ファイル 15Device: fc00h/64512d Inode: 4194340 Links: 1 16Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) 17Access: 2015-11-09 23:51:13.834887573 +0900 18Modify: 2015-11-09 23:51:13.834887573 +0900 19Change: 2015-11-09 23:51:13.834887573 +0900 20 Birth: -
statでみると 通常のファイルとかいてありますね。。。
投稿2015/11/09 14:52
総合スコア1768
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。