POSIX すべてのローカルファイルを検索

POSIX すべてのローカルファイルを検索

ファイルシステム内のすべてのローカルファイルを見つけるためにクロスプラットフォームのコマンドラインを作成しようとしています。

find私の意図は、POSIXパラメータのみを使用してこのコマンドを使用することです。 POSIXコマンドに制限され、プログラミングなしでリモートファイルシステムのファイルをスキップする方法はありますか?

私の現在のコマンドラインは次のとおりです。

find -type f -print

しかし、これは明らかにローカルファイルだけでなく、すべての一般的なファイルを一覧表示します。

私はこの-localフラグを知っていますが、私が知っている限り、それはPOSIXまたはクロスプラットフォーム標準の他の部分の一部ではありません。 locateクロスプラットフォームではないようです。私はまた、-xdevローカルにマウントされたすべてのファイルシステムを検索したいので、そのフラグが私が探しているものだとは思いません。//home両方がローカルで、私が実行しているfind / -xdev -print場合はfindスキップする必要があります/home(何か誤解しない限り)。

それが価値がある場合は、次のURLが役に立つリソースです。

答え1

POSIXインタフェースだけを使用してファイルシステムがリモートかローカルかを確認する方法はないと思います。 POSIXはコマンドを強制しません。mount私が知っている限り、ファイルシステムへのすべての参照は「実装定義」という用語で埋められています。

-localコマンドの本文は、findSolaris でのみ使用でき、リモートファイルシステムタイプを一覧表示する構成ファイルの存在に依存するため、あまり役に立ちません。

POSIXはコマンドを実行し、dfコマンドがフラグで使用される場合は特定の出力形式が必要です-P。その形式にはスペースで区切られた6つのフィールドがあり、その最初のものは「実装内のファイルシステムの名前です。定義された形式」、最後はマウントポイントです。

必要なのは、ローカルファイルシステムに対応するすべてのマウントポイントのリストです。ここでは、リモートファイルシステムと「似ている」ファイルシステム名を除外する経験的な方法を使用する必要があると思います。いくつかの例:

//...     CIFS (Samba)
host:...  NFS
/afs      AFS

これは完全なリストではなく、まったく保証できません。

その後、出力からこれらの行をフィルタリングして最初の5つの列を削除すると、マスターリストを使用してコマンドdfにリストを提供できます。find-xdev

これが本当のように聞こえても、ファイルシステムが実際に「マウント」(AFSを参照)したり、ファイルシステムが完全にローカルまたは完全にリモートであることを実際に保証することはできません(回路ベースのファイルシステムは単一のファイルを任意にリダイレクトできます)。だから私がアドバイスすることは慎重に進むように言うことです。

答え2

これは-xdevうまくいきますが、おそらく望む方法ではないかもしれません。POSIX find 男性find -xdev他のFSが見つかるまで実行します(ユーティリティまたはシステムコールを使用して確認Device IDできます)。statstat()

例えばlinux:

# stat /home/foo
  File: `/home/foo'
    . . .
Device: fd02h/64770d
  . . .
 # stat /boot/foo
  File: `/boot/foo'
  . . . 
Device: 801h/2049d   
  . . .

以下を参照してください-xdev

# find / -xdev -name foo -print
#

いいえ:

# find / -name foo -print
/home/foo
/boot/foo

   

確認するDevice IDSolaris

# truss -t lstat64 -v lstat64 ls /foo
lstat64("/foo", 0xFFBFFC48)
    d=0x02580000 . . .
# truss -t lstat64 -v lstat64 ls /etc/foo
lstat64("/etc/foo", 0xFFBFFB88)
    d=0x02580000 . . .
# truss -t lstat64 -v lstat64 ls /opt/foo
lstat64("/opt/foo", 0xFFBFFC48)
    d=0x02580004 . . .

関連情報