두 파일이 하드 링크되어 있습니까?

두 파일이 하드 링크되어 있습니까?

명령줄에서 두 파일이 하드 링크되어 있는지 어떻게 알 수 있나요? 예를 들어 다음과 같이 연결하세요.

$ ls
fileA fileB fileC

$ is-hardlinked fileA fileB
yes

$ is-hardlinked fileA fileC
no

답변1

대부분의 파일 시스템에서 파일은 해당 파일로 고유하게 식별됩니다.인덱스 노드따라서 확인해야 할 것은 두 파일의 inode 번호가 동일하고 동일한 파일 시스템에 있는지 여부입니다.

Ash, ksh, bash 및 zsh에는 파일 동등 연산자라는 검사를 수행하는 구성이 있습니다 -ef.

[ fileA -ef fileB ] && ! [ fileA -ef fileC ]

고급 사례의 경우 ls -i /path/to/file파일의 inode 번호를 나열하십시오. df -P /path/to/file파일이 위치한 파일 시스템을 표시합니다(두 개의 파일이 동일한 디렉터리에 있으면 동일한 파일 시스템에 있는 것입니다). 시스템에 해당 stat명령이 있는 경우 inode 및 파일 시스템 번호가 표시될 수 있습니다( stat시스템에 따라 다르므로 설명서를 확인하세요). 디렉토리 내의 하드 링크를 빠르게 탐색하려면 다음을 시도하십시오 ls -i | sort(아마도awk로 파이프).

1 모든 기본 Unix 파일 시스템 및 기타 일부(예: NTFS). 그러나 CramFS와 같은 특별한 경우는 아닐 수 있습니다.

답변2

function is-hardlinked() {
    r=yes
    [ "`stat -c '%i' $1`" != "`stat -c '%i' $2`" ] && r=no
    echo $r
}

답변3

첫 번째 포스터에서 제안했듯이 Linux에서 다음과 같은 스크립트를 작성할 수 있습니다.

stat -c '%i' fileA fileB fileC

답변4

내장된 bash 연산자를 사용하면 매우 간단하게 이 작업을 수행할 수 있습니다 -ef.

[[ file1 -ef file2 ]] && echo Same

조건이 참( file1그리고 file2동일)으로 평가되면 "동일"을 인쇄합니다. 그렇지 않으면 아무것도 출력되지 않습니다.

관련 정보