명령줄에서 두 파일이 하드 링크되어 있는지 어떻게 알 수 있나요? 예를 들어 다음과 같이 연결하세요.
$ 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
동일)으로 평가되면 "동일"을 인쇄합니다. 그렇지 않으면 아무것도 출력되지 않습니다.