
ls -li
디렉토리 내부에서 작업을 수행하면 다음과 같은 결과가 나온다고 가정해 보겠습니다 .
12353538 -rw-r--r-- 6 me me 1650 2013-01-10 16:33 fun.txt
출력에 표시된 대로 파일은fun.txt가지다6하드 링크; 아이 노드 번호는 다음과 같습니다12353538.
파일, 즉 동일한 inode 번호를 가진 파일에 대한 모든 하드 링크를 어떻게 찾나요?
답변1
기본 전제는 다음을 사용하는 것입니다.
find /mount/point -mount -samefile /mount/point/your/file
시스템에서는 findmnt
다음과 같이 마운트 지점을 파생할 수 있습니다.
file=/path/to/your/file
find "$(findmnt -o TARGET -cenT "$file")" -mount -samefile "$file"
/
대상 파일이 해당 파일 시스템에 있지 않는 한 검색하지 않는 것이 중요합니다. 왜냐하면 inode 번호는 마운트된 각 파일 시스템에서 재사용되기 때문입니다.
답변2
이미 inode 번호가 있는 경우 find 옵션을 사용할 수 있습니다 -inum
.
find /mount/point -xdev -inum 12353538
(일부 구현에서는 only is 표준 과 동등한 기능 find
도 지원합니다 ).-mount
-xdev
-xdev
답변3
ffind
~에서탐정 키트삭제된 파일 이름을 포함하여 inode의 모든 파일 이름을 찾을 수 있습니다.
예를 들어:
sudo ffind -a /dev/sda3 $(stat --format=%i ~/just_a_test)
수확량
* /home/me/empty_1
* /home/me/hard_link_to_empty1
/home/me/just_a_test
/home/me/hard_link_to_just_a_test
앞에 별표가 있는 항목은 더 이상 존재하지 않는 이전 파일 이름입니다(파일 이름이 바뀌거나 삭제되었기 때문에).
나는 $(stat --format=%i ~/just_a_test)
파일의 inode를 얻는 데 사용합니다.
프로그래밍 방식으로 파일 이름의 파티션을 얻으려면( /dev/sda3
이전 예에서) 다음을 사용할 수 있습니다.df
:
file=~/just_a_test; sudo ffind -a $(df -P "$file" | awk 'END{print $1}') $(stat --format=%i "$file")
답변4
이전 답변에 감사드립니다.
바이너리 stat
는 inode뿐만 아니라 해당 장치의 마운트 지점도 제공할 수 있습니다. 아래 스니펫은 이를 사용하여 '일반적인' 사용 사례를 해결합니다.
fn_hardlinks() {
declare target; target="$1" && shift
[ ! -e "$target" ] && \
{ echo "[error] invalid target: '$target'" 1>&2; exit 1; }
stat '/' 2>/dev/null 1>&2 || \
{ echo "[error] no functioning 'stat' binary found'" 1>&2; exit 1; }
declare mount; mount="$(stat -c '%m' "$target")"
declare inode; inode="$(stat -c '%i' "$target")"
[ "x${mount[-1]}" != "x/" ] && mount+="/"
find "$mount" -xdev -inum "$inode" 2>/dev/null
}
alias hardlinks=fn_hardlinks
실행 중:
> hardlinks ./resources/sphinx/gitinfo.py
/home/user/build/z-documentation/resources/sphinx/gitinfo.py
/home/user/build/sphinx-gitinfo/git/sphinx-gitinfo/gitinfo.py
추신: 이것을 어떻게 사용하느냐에 따라 exit
vs를 조심하세요 !return