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


27

명령 줄에서 두 파일이 하드 링크되어 있는지 어떻게 알 수 있습니까? 예를 들어 뭔가 링크 :

$ ls
fileA fileB fileC

$ is-hardlinked fileA fileB
yes

$ is-hardlinked fileA fileC
no

답변:


37

대부분의 파일 시스템 ¹에서 파일은 inode 번호로 고유하게 결정 되므로 두 파일의 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로 파이프 가능 ) 시도하십시오 .

¹ 모든 기본 유닉스 파일 시스템 및 NTFS와 같은 다른 시스템이지만 CramFS와 같은 이국적인 경우는 아닙니다.


그리고 "가교 된"파일로 탐지되는 FAT 기반의 어떤 것도 아닙니다.
이그나시오 바스케스-아 브람스

4
참고 fileA -ef fileB또한 반환 0하는 경우 (성공) fileAA와 심볼릭 링크 fileB반대 또는 반대를, 또는 같은 파일들이 모두 링크.
janmoesen

실제로 제안한 명령을 어떻게 실행합니까? [.bashrc -ef .bash / .bashrc]와 이것의 변형을 시도했지만 실제로 작동하지 않았습니다.
Charlie Parker

@CharlieParker [ .bashrc -ef .bash/.bashrc ]가 정확합니다. 물론 문맥이 없다면, 왜“실제로 작동하지 않았는지”알 수 없습니다. 잘못된 파일을 비교하거나, 결과를 올바르게 확인할 수없고 -ef, 셸없이 셸을 사용할 수 있습니다 .
Gilles 'SO- 악마 그만'

2
@CharlieParker이 명령은 실제로 [이며 동의어입니다 test. 그러나 man [또는 man test외부 명령의 맨 페이지를 제공하는 반면 거의 모든 쉘에는 약간 다른 옵션이있는 내장 명령이 있으므로 쉘 매뉴얼에서이를 찾아야합니다.
Gilles 'SO- 악마 그만해'

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

6
두 파일이 서로 다른 파일 시스템에 있지만 동일한 inode를 갖는 경우 이는 오 탐지 일 수 있습니다. 장치 번호도 테스트해야합니다 ( stat -c %d). 그리고 Linux를 사용하고 있다면 ( stat명령이 주어지면 ) 쉘은 [ fileA -ef fileB ]이 모든 것을 직접 수행해야합니다. 또한, 파일 이름이 공백을 포함하거나 사용하여 명령 무상 휴식 \[?*, 또는 시작이 -: 항상 명령 susbtitutions 주위에 따옴표를 넣어 ( "$(stat -c %i -- "$1")").
Gilles 'SO- 악마 그만해'

1
왜 성가 시지만 이식성이 좋은 구성을 function사용하고 함수 이름이 대시로되어있어 허용되는 이름에 대한 POSIX 규칙을 위반하는 이식 불가능한 키워드를 사용해야 합니까?
Charles Duffy

당신은 당신의 인용 깜빡 $1하고 $2. $()대괄호를 사용하면 명령이 시작되는 위치와 종료 위치 및 중첩이 더 간단 해 지므로 백틱 대신 구문 을 사용할 수도 있습니다 .
josch

3

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

stat -c '%i' fileA fileB fileC

4
이것만으로는 충분하지 않습니다. 다른 파일 시스템에 있지만 동일한 inode가있는 경우 두 파일에 대해 동일한 번호를 얻게됩니다. 장치 번호도 테스트해야합니다 ( stat -c %d). 그리고 Linux를 사용하고 있다면 ( stat명령이 주어지면 ) 쉘은 [ fileA -ef fileB ]이 모든 것을 직접 수행해야합니다.
Gilles 'SO- 악마 그만해'

0

GNU find(1)버전 4.2.11 이상에서는 다음을 사용할 수도 있습니다.

if [ "yes" = "$(find fileA -samefile fileB -exec echo yes \;)" ]; then
    echo yes
else
    echo no
fi

경우 fileA같은 파일로 fileB다음 find"예"인쇄 조건이 true가 될 것입니다.

파일 항등 연산자를 사용하는 것과 달리 -ef이것은 새로운 프로세스를 생성합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.