ファイルシステム内のすべてのローカルファイルを見つけるためにクロスプラットフォームのコマンドラインを作成しようとしています。
find
私の意図は、POSIXパラメータのみを使用してこのコマンドを使用することです。 POSIXコマンドに制限され、プログラミングなしでリモートファイルシステムのファイルをスキップする方法はありますか?
私の現在のコマンドラインは次のとおりです。
find -type f -print
しかし、これは明らかにローカルファイルだけでなく、すべての一般的なファイルを一覧表示します。
私はこの-local
フラグを知っていますが、私が知っている限り、それはPOSIXまたはクロスプラットフォーム標準の他の部分の一部ではありません。 locate
クロスプラットフォームではないようです。私はまた、-xdev
ローカルにマウントされたすべてのファイルシステムを検索したいので、そのフラグが私が探しているものだとは思いません。/
と/home
両方がローカルで、私が実行しているfind / -xdev -print
場合はfind
スキップする必要があります/home
(何か誤解しない限り)。
それが価値がある場合は、次のURLが役に立つリソースです。
答え1
POSIXインタフェースだけを使用してファイルシステムがリモートかローカルかを確認する方法はないと思います。 POSIXはコマンドを強制しません。mount
私が知っている限り、ファイルシステムへのすべての参照は「実装定義」という用語で埋められています。
-local
コマンドの本文は、find
Solaris でのみ使用でき、リモートファイルシステムタイプを一覧表示する構成ファイルの存在に依存するため、あまり役に立ちません。
POSIXはコマンドを実行し、df
コマンドがフラグで使用される場合は特定の出力形式が必要です-P
。その形式にはスペースで区切られた6つのフィールドがあり、その最初のものは「実装内のファイルシステムの名前です。定義された形式」、最後はマウントポイントです。
必要なのは、ローカルファイルシステムに対応するすべてのマウントポイントのリストです。ここでは、リモートファイルシステムと「似ている」ファイルシステム名を除外する経験的な方法を使用する必要があると思います。いくつかの例:
//... CIFS (Samba)
host:... NFS
/afs AFS
これは完全なリストではなく、まったく保証できません。
その後、出力からこれらの行をフィルタリングして最初の5つの列を削除すると、マスターリストを使用してコマンドdf
にリストを提供できます。find
-xdev
これが本当のように聞こえても、ファイルシステムが実際に「マウント」(AFSを参照)したり、ファイルシステムが完全にローカルまたは完全にリモートであることを実際に保証することはできません(回路ベースのファイルシステムは単一のファイルを任意にリダイレクトできます)。だから私がアドバイスすることは慎重に進むように言うことです。
答え2
これは-xdev
うまくいきますが、おそらく望む方法ではないかもしれません。POSIX
find
男性:find -xdev
他のFSが見つかるまで実行します(ユーティリティまたはシステムコールを使用して確認Device ID
できます)。stat
stat()
例えば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 ID
:Solaris
# 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 . . .