
유사한 기능을 사용하여 파일을 찾고 싶지만 find
패턴 일치를 통해 특정 심볼릭 링크만 따라갑니다.
분명히 find
자체적으로는 처리할 수 없습니다. 심볼릭 링크 따르기 동작을 설정하는 옵션이 없습니다. 순진하고 find -L
쉽게 라이브 잠금이 가능합니다(또는 매우 느립니다).
답변1
질문의 마지막 문장은 문제가 일반적으로 심볼릭 링크를 따르는 것이 아니라(예: -newer
한 경우에는 심볼릭 링크에 적용하고 다른 경우에는 대상에 적용하는 것) 문제가 아니라 다음 심볼릭 링크에 있음을 나타냅니다.디렉토리에그래서 당신이 원하지 않는 곳으로 내려갑니다.
당사양, find
무한 루프를 감지하므로 라이브 잠금이 발생하지 않아야 합니다. 자원(시간 포함)이 낭비되는 것은 문제가 될 수 있으며 귀하의 우려를 이해합니다.
우선, 따르기를 원하는 심볼릭 링크를 따르도록 -L
허용하는 데 사용합니다. find
그런 다음 다른 심볼릭 링크를 감지할 수 있는 방법이 필요합니다.
In은 find -L
-type l
결코 사실이 아니지만 다음을 사용하여 심볼릭 링크를 감지할 수 있습니다 -exec test -L {} \;
( -exec … \;
또한 테스트임을 기억하십시오. 내부 명령이 상태 0으로 종료되면 성공합니다). 이 방법을 사용하면 심볼릭 링크에 대해 일부 테스트를 적용하거나 -prune
그에 따라 적용할 수 있습니다.
예를 들어 다음 명령은 이름이 다음으로 시작 foo
하거나 다음으로 끝나는 심볼릭 링크만 내립니다 bar
.
find -L . -exec test -L {} \; ! \( -name 'foo*' -o -name '*bar' \) -prune -o -print
원래 원하는 표현이 무엇이든 뒤에 배치하세요 -prune -o
. 위 명령에서 "원래" 표현식은 입니다 -print
. -exec
암시적 을 억제 -print
하므로 필요한 경우 -print
(우리가 했던 것처럼) 명시적으로 추가하세요.
-name
심볼릭 링크 자체의 이름을 테스트합니다 . 대상의 이름을 테스트하려면 realpath
, 아마도 basename
일부 쉘 코드가 필요합니다. 예:
find -L . -exec test -L {} \; -exec sh -c '
case "$(basename "$(realpath "$1")")" in
baz* ) exit 0 ;;
*qux ) exit 1 ;;
esac
exit 0
' find-sh {} \; -prune -o -print
위 명령은 -prune
이름이 로 시작하는 모든 파일에 대한 심볼릭 링크를 지정 baz
하지만 이름이 끝나는 디렉터리 qux
(로 시작하지 않는 한 baz
)와 마지막으로 -prune
다른 모든 심볼릭 링크로 심볼릭 링크를 내립니다.
노트:
realpath
휴대할 수 없습니다basename
.realpath
모든 심볼릭 링크를 해결합니다.- 깨진 심볼릭 링크의 경우 동작은 예상한 것과 다를 수도 있고 그렇지 않을 수도 있습니다.
- 모든 파일에 대해 별도의 호출을 수행하면
test
성능이 저하되지만 더 나은 방법을 찾지 못했습니다.sh
,realpath
및 를 호출하는 것도basename
이 문제에서는 좋지 않지만 여기서는 심볼릭 링크에 대해서만 발생하므로 대부분의 경우 영향이 제한됩니다. find-sh
여기에 설명되어 있습니다 :의 두 번째 sh는 무엇입니까sh -c 'some shell code' sh
?- 예제에서
-prune
d를 얻는 경로 이름은 ed가 아닙니다-print
. 최종 조각을-prune -false -o -print
다음으로 변경하면 인쇄됩니다. 보다설명;-false
필요할 경우를 대비해 휴대용 대안이 있습니다.