他のファイルシステムへのシンボリックリンクを除外するには、find -mountを使用してください。

他のファイルシステムへのシンボリックリンクを除外するには、find -mountを使用してください。

私は何よりもアーカイブのためにディレクトリ(ファイルとサブディレクトリ)のすべてのアイテムのリストを抽出するスクリプトを書いていますが、リモートシンボリックリンク(他のファイルシステム)をスキップする必要があります。スクリプトは、find . -mount他のファイルシステムへのシンボリックリンクを除外しているように見えるSolarisから移行されました。

-mount次のマニュアルページを見つけます。

-mount Don't  descend directories on other filesystems.  An alternate name for -xdev, for compatibility with some other versions of find.

私はそれを試しましたが、-xdevそれも動作しませんでした。

違いにより、リモートシンボリックリンクが削除されました。

リモートシンボリックリンクリターンを削除するためにこの問題を1行に変更する方法をご存知ですか?

答え1

Solarisの行動には欠陥があります。-mountこれは、-xdevブートファイルシステムの外部を指すシンボリックリンクを除外する必要はありません。この動作はSolaris ドキュメント、他の実装ではこれを行いません。つまり-xdevfind再帰ディレクトリ検索が特定のマウントポイントに達すると、そのマウントポイントを完全にスキップします。

find私はシンボリックリンクターゲットを含むデバイスごとに一致をフィルタリングする簡単な方法がないと思います。これは依存関係です。statLinuxのユーティリティ(Solarisでは機能しません)

find /some/path -xdev \( ! -type l -o -exec sh -c '[ "$0" = "$(stat -L -fc %t "$1")" ]' "$(stat -fc %t /some/path)" {} \; \) -print

つまり、シンボリックリンクではなくすべてを印刷し、シンボリックリンクの場合、ターゲットのファイルシステム番号が開始点のファイルシステム番号と一致する場合にのみ印刷します。ぶら下がっているシンボリックリンクは除外され、エラーメッセージが表示されます。これを含めるには-o -xtype l後ろに追加し、自動的に除外するには後ろに追加します。! -type l-xtype l -o-xdev

関連情報