ディレクトリ下のすべてのファイルを収集しています。ただし、そのディレクトリには、findコマンドを実行したディレクトリ以外のディレクトリへのシンボリックリンクがあり、多くのファイルとディレクトリが含まれています。 pruneを使用してこのディレクトリを無視することはできますが、シンボリックリンクがこの大きなディレクトリのサブディレクトリを指すときに問題が発生します。サブディレクトリのシンボリックリンクを指すすべてのシンボリックリンクを無視したいと思います。
以下はコマンド例です。find -L /usr/local/searchdir
シンボリックリンクがほとんどない
/usr/local/searchdir/d0/link --> /small/dir
/usr/local/searchdir/d1/file.o
/usr/local/searchdir/d2/link --> /little/dir
/usr/local/searchdir/d3/link --> /hugedir
/usr/local/searchdir/d4/link --> /hugedir/main
.
.
.
/usr/local/searchdir/dx --> /hugedir/c4
問題のあるディレクトリ
/hugedir/c1/tmp
/hugedir/c2/main
/hugedir/c3/dir
/hugedir/c4/ext
/hugedir/c5/client
/hugedir/c6/bin
/hugedir/c7/std
ベストアンサー1
GNUにはシンボリックリンクのターゲットを一致させるオプションがfind
ありますが、/では機能しません。-lname
-L
-follow
あなたがそれを使用したいと仮定すると、リンクがその大きなディレクトリにあることを確認するために電話をかけて独自のチェックを実装する必要があり-L
ます。-exec
GNUは、システムがGNUオプションを持ってサポートしていると仮定して、ここで最適化find
として使用されます。-xtype
readlink
-f
readlink
find -L . -type d -xtype l -exec sh -c '
case $(readlink -f "$1") in
(/hugedir | /hugedir/*) exit 0;;
(*) exit 1;;
esac' sh {} \; -prune -o ...
それとも少し効率的です。
find -L . -type d -xtype l -exec sh -c '
cd -P "$1" && case $PWD in
(/hugedir | /hugedir/*) exit 0;;
(*) exit 1;;
esac' sh {} \; -prune -o ...