私は何よりもアーカイブのためにディレクトリ(ファイルとサブディレクトリ)のすべてのアイテムのリストを抽出するスクリプトを書いていますが、リモートシンボリックリンク(他のファイルシステム)をスキップする必要があります。スクリプトは、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 ドキュメント、他の実装ではこれを行いません。つまり-xdev
、find
再帰ディレクトリ検索が特定のマウントポイントに達すると、そのマウントポイントを完全にスキップします。
find
私はシンボリックリンクターゲットを含むデバイスごとに一致をフィルタリングする簡単な方法がないと思います。これは依存関係です。stat
Linuxのユーティリティ(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