質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

5回答

10957閲覧

testコマンドのfオプションeオプションの違いについて

hisasuke

総合スコア20

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2015/11/09 14:34

testコマンドの似たようなオプションに「f」と「e」があります。
調べたところ、以下の違いがあるようです。

-f:file が普通のファイルならば真となる。
-e:file が存在するならば真となる。

この「普通のファイル」とはどういったものでしょうか。
分かる方おりましたらよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

「普通のファイル」というのは、"regular file" の訳で、下記のリストのうち、ディレクトリーと特殊ファイル以外のファイルのことを指します。
「通常のファイル」とも表記されることがあります。

これらのファイルは、ls -lコマンドで表示したときに、一番左の1桁に属性が表示されます。

■リスト

d : ディレクトリー b : ブロックスペシャルファイル/ブロック型特殊ファイル c : キャラクタースペシャルファイル/文字型特殊ファイル l : シンボリックリンク p : 名前つきパイプ/FIFO特殊ファイル s : ソケット - : 通常のファイル

投稿2015/11/09 14:57

argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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

KenTerada

総合スコア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
katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hisasuke

2015/11/09 15:27

分かりやすいサイトありがとうございます。勉強になりました。
guest

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
otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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

Ken.sakanakana

総合スコア1768

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hisasuke

2015/11/09 15:28

statコマンドで確かめられるのですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問