![심볼릭 링크와 해당 포인터를 제외한 디렉토리의 내용을 나열하는 방법은 무엇입니까?](https://linux55.com/image/195192/%EC%8B%AC%EB%B3%BC%EB%A6%AD%20%EB%A7%81%ED%81%AC%EC%99%80%20%ED%95%B4%EB%8B%B9%20%ED%8F%AC%EC%9D%B8%ED%84%B0%EB%A5%BC%20%EC%A0%9C%EC%99%B8%ED%95%9C%20%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%EC%9D%98%20%EB%82%B4%EC%9A%A9%EC%9D%84%20%EB%82%98%EC%97%B4%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
응용 프로그램이 설치된 디렉터리가 있고 최신 버전을 가리키도록 심볼릭 링크를 업데이트합니다.
이로 인해 이를 가리키는 기호 링크가 없기 때문에 많은 오래된 디렉토리가 사용되지 않게 됩니다.
지금까지 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 find
및 realpath
, 개행 문자가 있는 파일 이름이 없다고 가정:
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