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
(일부 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
사용 방법에 따라 다릅니다!