디렉토리 트리에서 모든 절대 링크 찾기

디렉토리 트리에서 모든 절대 링크 찾기

(상대적인 방법이 아닌) 절대적인 방법으로 대상을 식별하는 디렉토리의 모든 심볼릭 링크를 (재귀적으로) 감지하는 방법은 무엇입니까?

이러한 링크는 전체 디렉토리 트리를 이동할 때 깨질 가능성이 있으므로 이를 식별할 수 있는 방법이 필요합니다.

디렉토리 트리를 이동하면(디렉토리 트리의 루트 외부를 가리키는 경우) 상대 링크도 깨질 수 있지만 내 생각에는 이 작업이 다음에서 수행된 것 같습니다.이 문제.

답변1

절대 링크를 찾으려면 지원하는 경우 finds 옵션을 사용할 수 있습니다 -lname(적어도 GNU, FreeBSD 및 macOS에서는 사용 가능 find).find

find . -type l -lname '/*'

이를 위해서는 쉘 와일드카드 일치를 사용하여 find기호 링크의 파일 이름과 해당 내용(대상)을 인쇄 해야 합니다 /*.

엄밀히 말하자면,/POSIX는 1개 또는 3개 이상 으로 시작하는 절대 경로 이름을 지정합니다 ./;그것과 일치시키기 위해 다음을 사용할 수 있습니다

find . -lname '/*' ! -lname '//*' -o -lname '///*'

//foo/bar는 /foo/bar와 어떤 시스템에서 다릅니까?자세한 내용이 있습니다.

(감사해요카츠라 사토-lname이는 GNU에만 해당됨 을 나타냅니다 .FD0적어도 FreeBSD와 macOS에서도 실제로 사용할 수 있다는 점은 언급할 가치가 있습니다.스티븐 차제라스POSIX 절대 경로 이름 정의를 호출하는 데 사용됩니다. )

답변2

당신은 찾을 수 있습니다symlinks유용한 유틸리티:

$ symlinks -r .
other_fs: /home/chazelas/test/bin -> /bin
dangling: /home/chazelas/test/DIR/foo -> foo
dangling: /home/chazelas/test/blah -> not-here
absolute: /home/chazelas/test/chazelas -> /home/chazelas

링크를 수정해 드릴 수 있습니다. -t그게 뭔지 말해 주지회의하다:

$ symlinks -rct .
other_fs: /home/chazelas/test/bin -> /bin
dangling: /home/chazelas/test/DIR/foo -> foo
dangling: /home/chazelas/test/blah -> not-here
absolute: /home/chazelas/test/chazelas -> /home/chazelas
changed:  /home/chazelas/test/chazelas -> ../../chazelas

관련 정보