検索を使用してシンボリックリンクを追跡するときは、特定のルートディレクトリの下のディレクトリを無視します。

検索を使用してシンボリックリンクを追跡するときは、特定のルートディレクトリの下のディレクトリを無視します。

ディレクトリ下のすべてのファイルを収集しています。ただし、そのディレクトリには、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として使用されます。-xtypereadlink-freadlink

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).

関連情報