파일/디렉토리로 연결되는 모든 링크(하드 및 기호 링크 및 이들의 조합)를 철저하게 찾습니다.

파일/디렉토리로 연결되는 모든 링크(하드 및 기호 링크 및 이들의 조합)를 철저하게 찾습니다.

나는 (최대 이식성을 위해) "기본" 명령만 사용하여 찾고 싶습니다(예: 최근 세부 정보가 포함된 항목뿐만 아니라 AIX/Linux/등에서 작동하는 항목 ^^)모두특정 파일/디렉토리를 가리키는 파일(기호 링크, 하드 링크 및 이들의 조합)입니다.

성급하게 대답하지 않도록 주의하십시오 find / -ls | grep ..... 많은 것을 놓칠 것입니다. 하드 링크, 심볼릭 링크, 상대 경로 및 절대 경로를 혼합할 수 있는 가능성은 아래 링크를 참조하세요(심볼릭 링크 "././././."를 사용할 수도 있음).

  • 하드 링크와 심볼릭 링크는 무한정 "중첩"될 수 있습니다.
  • 일부 기호 링크는 전체 경로일 수 있고 다른 기호 링크는 상대 경로일 수 있습니다.
  • 이러한 경로(상대 또는 절대)는 매우 복잡할 수 있습니다(예: /tmp/./././etc/file ).
  • 심볼릭 링크는 다른 파일에 하드 링크된 파일로 이어질 수 있으며, 이는 차례로 세 번째 파일에 대한 심볼릭 링크가 되어 결국 [추가 반복 후] 최종 대상에 도달합니다...

마지막으로, 나는 "단지" 이해하는 방법을 찾아야만 합니다.파일/링크의 "최종 목적지"는 무엇입니까(즉, 결국 어떤 inode에 액세스하게 될까요?) 하지만 그것은진짜어려움(일부 마법 함수가 "최종 대상 inode는 다음과 같습니다. ..."라고 알려주지 않는 한. 그게 바로 제가 필요한 것입니다!)

나는 find의 "-H" 또는 "-L" 옵션을 간단히 사용할 수 있다고 생각했지만 (바보일지도 모르지만...) 아직 작동하지 않았습니다.

모든 정보를 환영합니다(그러나 "Linux에서만 사용할 수 있는 좋은 유틸리티"가 아닌 find /ls/etc를 사용하십시오).

"/tmp/A" 디렉토리에 대한 몇 가지 다른 링크를 생성하고 해당 링크를 모두 찾아서 나열하는 방법을 찾으십시오.

mkdir /tmp/A    /tmp/B
ln -s /tmp/A/   /tmp/B/D  #absolute symlink, with a training "/"
ln -s ../A      /tmp/B/E     #relative symlink
ln -s /tmp/A/.  /home/F  #absolute symlink, with a trailing "/."
ln -s ../tmp/A/./.  /var/L  #let's get craaaaaaazy! symlinks are "fun"...
ln    /tmp/B/D  /etc/G    #Hard-link to the symlink file /tmp/B/D, which itself symlink to /tmp/A/ witch ends up being the same as "/tmp/A" in most cases.
ln    /etc/G    /etc/G2   #and a duplicate of the previous one, just to be sure [so /etc/G, /etc/G2, and /tmp/B/D have same inode, but it's a different inode from the final destination... :(
ln -s etc/G /thatsenough   #symlink again, for further chaining

그런 다음 몇 가지를 시도해 보세요.

find -H / -ls   # show inodes of the links and symlinks, not of the "final" directory
find -L / -ls   # same thing (I do try that on an OLD AIX ...)
find -H / -inum 123456 -ls  #if /tmp/A/. has inode 123456. This lists *only* hardlinks to /tmp/A, ie will only print a subset (and /tmp/A have to be a file in that case)

호출 중 하나에서 모든 경로 앞에 최종 inode(123456)가 표시될 것으로 예상했지만(두 가지 모두에 "-follow"도 추가했습니다) 항상 "최종 대상" "인덱스 노드" 대신 연결된 inode가 표시됩니다(예: /tmp/A)

내가 마지막으로 방문한 "최종 인덱스 노드"를 알아내기 위해 무엇을 사용할 수 있습니까? [운영 체제가 관리하지만 "간단한" 명령으로 "를 통해 미리 알려줄 수 있습니다.저것당신이 열 파일저것마지막 인덱스 노드! "?]

답변1

이 질문에 대한 단일 답변은 없습니다. 예를 들어 트리의 여러 기호 링크를 연결하면 동일한 인덱스 노드로 확인되는 무한한 수의 경로를 만들 수 있습니다.

완전한 이식성에 대한 귀하의 욕구 또한 성공할 가능성이 낮습니다. 예를 들어 "찾기"조차도 GNU, BSD, POSIX 및 기타 변형 간에(물론 해당 변형의 버전 간에도) 크게 다릅니다.

하지만 당신이 원하는 것은 아마도 find / -samefile /absolute/path/to/file.

이는 GNU find >= 4.2.11에서 사용할 수 있습니다.

답변2

ls-L심볼릭 링크를 효율적으로 추적하고 최종 개체의 권한, 소유자, inode 등을 표시하는 옵션이 있습니다 . [ stat(target)대신 ]을 수행하여 lstat(target)이 작업을 수행합니다 . 최상의 결과를 얻으려면 루트로 실행하거나 관련 마운트된 파일 시스템에 대한 읽기 액세스 권한이 있는 사용자로 실행하십시오.

귀하의 경우에는 다음을 시도해 보십시오.

find / -exec ls -iLd {} | grep inodenum

[OP의 요청에 따라 내 의견에서 복사되었습니다. ]

답변3

고쳐 쓰다:Mark Plottnick의 답변(내 질문 아래)은 훨씬 간단하고 파일과 디렉토리에서 작동하며 사이의 링크 조합을 따라 최종 대상의 inode를 제공합니다!
이것이 내가 찾고 있는 것입니다. [테스트 디렉토리에서 특별한 경우를 잊어버리지 않는 한]
최종 솔루션이 매우 우아하고 이식성이 뛰어나서 정말 기쁩니다! 마크님, 제가 진드기를 줄 수 있도록 글을 올려주세요 ^^

아래에 나만의 해결 방법을 제시했는데 이제 다음과 같습니다.매우바보^^

===

대상 파일이 디렉터리일 때 몇 가지 매우 간단한 해결 방법을 찾았습니다! "/"만 추가하면 됩니다. 이름 뒤에는 최종 목적지의 디렉토리 inode가 표시됩니다! 그리고 여전히 원래 경로를 인쇄합니다!

find / -print | xargs -n 1 ls -ild '{}'/. 2>/dev/null | grep inodeyouwant

참고: "심볼릭 링크인지 하드 링크인지 알지 못한 채 파일에서 이 작업을 수행하려고 합니다"의 내용은 매우 부담스럽기 때문에 하드 링크와 심볼릭 링크가 있는 파일만 찾도록 업데이트하겠습니다.

하지만 이제 "결국 디렉토리로 부팅하지 않는" 파일(즉, 궁극적으로 디렉토리가 아닌 것을 가리키는 링크/심볼릭 링크/체인)에 대해 이 작업을 수행할 수 있는 방법을 찾아야 합니다(다시 말하지만, 최종 대상을 수정하지 않고!).

좋은 방법 찾으면 업데이트 하겠습니다

답변4

GNU 사용 find:

find -L . \( ! -xtype l -o -prune \) -samefile /path/to/the/file -print

동일한 파일로 연결되는 다양한 표준 경로가 보고됩니다./path/to/the/file

그리고 zsh:

printf '%s\n' **/*(De:'[[ $REPLY -ef /path/to/the/file ]]')

아직 POSIX는 아니지만 [ file -ef other-file ]널리 지원되며사양의 다음 버전에 포함하는 것에 대해 이야기하세요..

find . -exec sh -c '
  for file do
    [ "$file" -ef /path/to/the/file ] && printf "%s\n" "$file"
  done' sh {} +

shAT&T ksh, pdksh, bash, zsh, ash또는 적어도 작동해야 합니다( 이를 기반으로 하지 않는 yashPOSIX 구현은 모르겠습니다 ).sh

관련 정보