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

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

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

おすすめ記事