ディレクトリ下のすべてのファイルを収集しています。ただし、そのディレクトリには、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 ...
答え2
デフォルトでは、このfind
コマンドはシンボリックリンクを無視します。とにかく、フラグを使用してこの動作を明示的に指定できます-P
。
-P Never follow symbolic links. This is the default behaviour. When find examines or prints information a file, and the file is a symbolic link, the information used shall be taken from the
properties of the symbolic link itself.
-L Follow symbolic links. When find examines or prints information about files, the information used shall be taken from the properties of the file to which the link points, not from the link
itself (unless it is a broken symbolic link or find is unable to examine the file to which the link points). Use of this option implies -noleaf. If you later use the -P option, -noleaf will
still be in effect. If -L is in effect and find discovers a symbolic link to a subdirectory during its search, the subdirectory pointed to by the symbolic link will be searched.
When the -L option is in effect, the -type predicate will always match against the type of the file that a symbolic link points to rather than the link itself (unless the symbolic link is
broken). Using -L causes the -lname and -ilname predicates always to return false.
-H Do not follow symbolic links, except while processing the command line arguments. When find examines or prints information about files, the information used shall be taken from the proper‐
ties of the symbolic link itself. The only exception to this behaviour is when a file specified on the command line is a symbolic link, and the link can be resolved. For that situation,
the information used is taken from whatever the link points to (that is, the link is followed). The information about the link itself is used as a fallback if the file pointed to by the sym‐
bolic link cannot be examined. If -H is in effect and one of the paths specified on the command line is a symbolic link to a directory, the contents of that directory will be examined
(though of course -maxdepth 0 would prevent this).