[unix] 모든 심볼릭 링크를 따르지 않고 가장 많이 찾도록하려면 어떻게해야합니까?

내 OS와 홈 디렉토리가 SSD에 있습니다. 큰 파일을 하드 디스크에 저장하고 내 홈 디렉토리에서 하드 디스크로 symlink를 연결합니다 (예 : ~ / Videos / Films는 / mnt / hdd / Films에 대한 심볼릭 링크입니다). 또한 많은 와인 접두사가 있으며 각 와인에는 dosdevices / z가 있습니다.

따라서 -L없이 find를 사용하면 하드 디스크에있는 모든 것을 놓치게됩니다. 그러나 -L과 함께 find를 사용하면 Wine의 /에 대한 심볼릭 링크로 인해 루프가 생깁니다.

이것을 해결하는 합리적인 방법이 있습니까? 그래서 내가 원하는 곳에서 검색을 찾으십시오. 직관적으로, 나는 “dosdevices라는 디렉토리에 있지 않은 한 심볼릭 링크를 따르십시오”라는 라인을 따라 무언가를 원합니다. “하드 디스크에있는 심볼릭 링크를 따라 가십시오”도 작동합니다.



답변

-prune차 알려줍니다 find디렉토리 아래에 같이 Recurse에 없습니다.

find -L -path ~/.wine/dosdevices -prune -o -type f -name 'My Favorite Movie.*' -print

당신이 사용하려는 경우 -lname당신의 상태에서, 당신은 사용할 수 -L있기 때문에, 옵션을 -L원인 대부분의 술어가 포함 링크의 대상에 작용 -lname. 이 경우 필자는 홈 디렉토리와 하드 디스크 루트를 모두 검색의 루트로 사용하는 것이 좋습니다.

find ~ /mnt/hdd -xtype f -name 'My Favorite Movie.*'

당신은 실행할 수있는 find ~ -type l …심볼릭 링크의 목록을 수집하고, 추가 뿌리로 사용.

( IFS=$'\n'; set -f;
  find ~ $(find ~ -type l -lname '/mnt/hdd/*') \
       -xtype f -name 'My Favorite Movie.*' )

심볼릭 링크 아래에서 실제로 재귀를 원하면 이름 대신 대상별로 특정 심볼릭 링크를 제외 할 수 있습니다. 그러나 이런 식으로 패턴이나 하위 트리가 아닌 유한 목록 만 제외 할 수 있습니다.

find -L \( -samefile /exclude/this -o -samefile ~/and/that \) -prune -o \
     -type f -name 'My Favorite Movie.*' -print

! -writable(쓰기 권한이없는 파일) 과 같은 다른 기준을 사용할 수 있지만 GNU find에는 대상 텍스트가 특정 표현식과 일치하는 경우에만 심볼릭 링크에서 재귀하는 방법이 없다고 생각합니다.

find충분한 심볼릭 링크를 제외하지 않고 거의 원하는 것을 수행 하는 명령을 빌드하고 find2perl 을 실행 하여 쿼리를 Perl 스크립트로 변환 한 다음 Perl 스크립트를 약간 조정할 수 있습니다. 그러나 find2perl이 인식하지 못하는 많은 GNU find 스위치가 있습니다.


답변

모든 링크를 검색하려면 다음과 같이 작동했습니다.

find -L . -name \*.txt


답변

하드 디스크에 몇 개의 심볼릭 링크가 있습니까? 너무 많지 않은 경우 find 명령 행에서 따르려는 심볼릭 링크를 명시 적으로 지정하는 동안 “-L”을 사용하지 않는 것이 하나의 솔루션입니다. 다음과 같은 것 :

find .  ~/Videos/Films -name '*file I want*' ...

이렇게하면 현재 디렉토리 ( “.”)와 심볼릭 링크 “~ / Videos / Films”가 검색되지만 다른 심볼릭 링크로 내려 가지 않습니다.


답변

문제를 회피하는 또 다른 해결책은 (적어도 나의 경우에는) 하드 디스크의 디렉토리에 대한 심볼릭 링크 대신 바인드 마운트를 사용하는 것입니다. 다음 /etc/fstab과 같이 항목을 추가 하면됩니다.

/mnt/hdd/Films /home/mark/Videos/Films none bind 0 0


답변