나는 (최대 이식성을 위해) "기본" 명령만 사용하여 찾고 싶습니다(예: 최근 세부 정보가 포함된 항목뿐만 아니라 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 {} +
sh
AT&T ksh
, pdksh
, bash
, zsh
, ash
또는 적어도 작동해야 합니다( 이를 기반으로 하지 않는 yash
POSIX 구현은 모르겠습니다 ).sh