심볼릭 링크와 해당 포인터를 제외한 디렉토리의 내용을 나열하는 방법은 무엇입니까?

심볼릭 링크와 해당 포인터를 제외한 디렉토리의 내용을 나열하는 방법은 무엇입니까?

응용 프로그램이 설치된 디렉터리가 있고 최신 버전을 가리키도록 심볼릭 링크를 업데이트합니다.

이로 인해 이를 가리키는 기호 링크가 없기 때문에 많은 오래된 디렉토리가 사용되지 않게 됩니다.

지금까지 ls -l검사를 사용하고 수동으로 제거해 왔습니다. 이를 스크립트로 작성할 수 있으면 유용할 것입니다.

심볼릭 링크를 제외할 수 있나요?

find -maxdepth 1 \! -type l -exec ls -dl {} +

그런데 그들이 무엇을 가리키는지 어떻게 찾아내고 배제하는지 모르겠습니다.

심볼릭 링크를 제외한 디렉토리를 나열하는 방법그리고그들이 가리키는 디렉토리는 무엇입니까?

답변1

이를 통해 zsh다음을 수행할 수 있습니다.

linktargets=(*(N@:P))
ls -ld -- *(^@e['(($linktargets[(eI)$REPLY:P]))'])

모든 심볼릭 링크에 적용되는 $linktargets배열을 만든 realpath()다음 ls -ld심볼릭 링크가 아니고 배열에서 실제 경로를 찾을 수 없는 파일을 전달합니다.

실제 경로를 가져오는 것과 관련되지 않는 또 다른 방법은 모든 비-symlink 파일의 배열, 즉 기호 링크 대상을 포함하는 또 다른 배열을 구축한 다음 두 개를 빼는 것입니다.

zmodload zsh/stat
non_symlinks=(*(^@))
stat -A symlink_targets +link -- *(@)
ls -ld -- ${non_symlinks:|symlink_targets}

심볼릭 링크 대상에는 문자가 포함되어 있지 않다고 가정하지만 /(링크는 link -> file, is not link -> ./file, link -> /path/to/file...)

답변2

GNU findrealpath, 개행 문자가 있는 파일 이름이 없다고 가정:

find . -mindepth 1 -maxdepth 1 -exec realpath -e --relative-to=. {} + | sort | uniq -u

이는 realpath모든 경로를 확인하도록 요구하여 기호 링크로 가리키는 파일이 목록에 두 번 표시되도록 함으로써 수행됩니다. sort | uniq -u한 번 표시된 콘텐츠만 유지됩니다.

주의 깊은트리 외부(또는 하위 디렉터리)를 가리킬 수 있는 심볼릭 링크를 사용하면 이에 대해 알고 싶을 수도 있지만 해당 파이프에 grep -v /항목을 추가하기 | xargs rm -fr전에 필터링할 수도 있습니다 ;-).

더 나은(더 표준적이지만 덜 명확한) 대안 find . -mindepth 1 -maxdepth 1 ...은 입니다 find . ! -name . -prune ....

GNU 도구 -z와 옵션을 사용하여 파일 이름에 줄 바꿈을 지원할 수도 있습니다.-0

또한 참고하시기 바랍니다현지화 마무리구현은부서진sort많은 시스템에서(일부 특수 문자는 완전히 무시됨) 및 의 현지화를 비활성화하는 것이 좋습니다 uniq.

함께 넣어보세요:

find . ! -name . -prune -exec realpath -ez --relative-to=. {} + |
  grep -zv / |
  LC_ALL=C sort -z |
  LC_ALL=C uniq -zu |
  xargs -r0 do_something

관련 정보