소프트 링크는 원본 파일 readlink
등을 쉽게 추적할 수 있지만 원본 파일에 대한 하드 링크를 추적하는 데 문제가 있습니다.
$ ll -i /usr/bin/bash /bin/bash
1310813 -rwxr-xr-x 1 root root 1183448 Jun 18 21:14 /bin/bash*
1310813 -rwxr-xr-x 1 root root 1183448 Jun 18 21:14 /usr/bin/bash*
^
위의 내용은 예상대로 작동합니다. - 멋진 -> 두 파일 모두 동일한 inode 1310813을 가리킵니다
(그러나 표시되는 링크 수는 ^
1로 표시됩니다. 그 이유는 Gilles의 답변에서 이해할 수 있습니다).
$ find / -samefile /bin/bash 2>/dev/null
/usr/bin/bash
위의 내용이 예상되므로 문제가 없습니다.
$ find / -samefile /usr/bin/bash 2>/dev/null
/usr/bin/bash
위는아니요시원한. 원본 파일을 추적하는 방법 또는하드 링크당이 /usr/bin/bash
문서를 참조로 사용하시겠습니까?
이상함 - 다음도 도움이 되지 않습니다.
$ find / -inum 1310813 2>/dev/null
/usr/bin/bash
답변1
첫째, 하드 링크의 경우 원본 파일이 없습니다. 모든 하드 링크가 동일하게 생성됩니다.
ls -l
그러나 출력에 링크 수가 1로 표시된 것처럼 여기에는 관련된 하드 링크가 없습니다.
$ ll -i /usr/bin/bash /bin/bash 1310813 -rwxr-xr-x 1 root root 1183448 Jun 18 21:14 /bin/bash* 1310813 -rwxr-xr-x 1 root root 1183448 Jun 18 21:14 /usr/bin/bash*
bin
을(를) 가리키는 심볼릭 링크로 인해 문제가 발생합니다 usr/bin
.bash
사용 가능한 모든 경로find
, 다음 옵션을 사용하여 심볼릭 링크를 따르도록 지시 해야 합니다 -L
.
$ find -L / -xdev -samefile /usr/bin/bash 2>/dev/null
/usr/bin/rbash
/usr/bin/bash
/bin/rbash
/bin/bash
-xdev
나는 귀하의 시스템이 단일 파일 시스템에 마운트되어 있다는 것을 알고 있기 때문에 여기에서 사용합니다 . 이렇게 하면 /dev
, 등의 /proc
문제 가 발생하는 것을 방지할 수 있습니다./run
/sys
답변2
/usr/bin/bash 파일을 참조로 사용하여 원본 파일 또는 각 하드 링크를 추적하는 방법
find
GNU find(또는 해당 옵션이 있는 다른 버전 -samefile
) 를 사용하고 파일 시스템에 /usr/bin/bash
있다고 가정하면 /
다음이 맞습니다.
find / -xdev -samefile /bin/bash
하드 링크는 파일 시스템 경계를 넘을 수 없기 때문에 사용 -xdev
됩니다 . 리디렉션하지 마세요 오류: 디렉터리를 탐색할 수 있는 권한이 없으면 해당 디렉터리 아래에 하드 링크가 있을 수 있으며 이를 놓칠 수 있습니다.
당신이 저지르고 있는 실수는 존재하지 않는 또 다른 하드 링크를 찾고 있다는 것입니다. 실제로 존재하지 않는다는 정보가 있습니다.
1310813 -rwxr-xr-x 1 root root 1183448 Jun 18 21:14 /bin/bash*
^
하드 링크 수는 /bin/bash
1입니다.
파일이 있습니다 /
. /usr/bin/bash
파일이 다른 이유로 /bin/bash
있습니다 ./usr/bin/bash
목차 /bin
그리고 /usr/bin
같은 파일입니다. find / -samefile /bin/bash
을 가리키므로 에 대한 심볼릭 링크가 /usr/bin/bash
있습니다 . 보다 정확하게는 질문의 정보를 기반으로 이것이 디렉토리 하드 링크(잘 지원되지 않고 거의 사용되지 않는 기능)가 아니라고 가정하면 이것이 다른 심볼릭 링크를 가리키는 심볼릭 링크일 수 있음을 알 수 있습니다. 등은 결국 동등한 경로(예: ) 로 확인되지만 대부분 심볼릭 링크 타겟팅일 가능성이 높습니다 ./bin
/usr/bin
/bin
/bin
/usr/bin
/usr/bin
///////usr/bin/
/usr/bin
전체 시스템에서 파일에 대한 모든 심볼릭 링크를 찾는 것은 특별히 효율적이지 않습니다. 예를 들어 Linux에는 bash를 실행하는 각 프로세스에 대한 /proc/*/exe
심볼릭 링크 인 파일이 있습니다 . 디렉토리에 대한 심볼릭 링크를 찾으면 지적된 대로 ( chrooted 프로세스 제외) 무한 재귀가 발생하게 됩니다./usr/bin/bash
/bin/bash
/proc/*/root
/
두 경로가 동일한 파일을 가리키는지 확인해야 하는 경우 Linux에서는 다음 방법 중 하나를 사용할 수 있습니다.
[ /bin/bash -ef /usr/bin/bash ]
test /bin/bash -ef /usr/bin/bash
( -ef
POSIX는 아니지만 dash, bash, BusyBox 및 GNU coreutils에 있습니다). 서로 다른 파일이 항상 서로 다른 정식 이름을 갖는다는 점에서 파일의 정식 경로를 가져와야 하는 경우 다음을 사용할 수 있습니다.
readlink -f /bin/bash
(예를 들어 동일한 네트워크 위치가 두 가지 다른 방식으로 마운트된 경우 마운트된 디렉터리 전체에서 동일한 파일이 손실될 수 있습니다.)