찾기를 사용하여 기호 링크를 추적할 때 특정 루트 디렉터리 아래의 디렉터리를 무시합니다.

찾기를 사용하여 기호 링크를 추적할 때 특정 루트 디렉터리 아래의 디렉터리를 무시합니다.

디렉토리 아래의 모든 파일을 수집하고 있습니다. 하지만 해당 디렉토리에는 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).

관련 정보