답변:
대부분의 파일 시스템 ¹에서 파일은 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와 같은 이국적인 경우는 아닙니다.
fileA -ef fileB
또한 반환 0
하는 경우 (성공) fileA
A와 심볼릭 링크 fileB
반대 또는 반대를, 또는 같은 파일들이 모두 링크.
[ .bashrc -ef .bash/.bashrc ]
가 정확합니다. 물론 문맥이 없다면, 왜“실제로 작동하지 않았는지”알 수 없습니다. 잘못된 파일을 비교하거나, 결과를 올바르게 확인할 수없고 -ef
, 셸없이 셸을 사용할 수 있습니다 .
[
이며 동의어입니다 test
. 그러나 man [
또는 man test
외부 명령의 맨 페이지를 제공하는 반면 거의 모든 쉘에는 약간 다른 옵션이있는 내장 명령이 있으므로 쉘 매뉴얼에서이를 찾아야합니다.
function is-hardlinked() {
r=yes
[ "`stat -c '%i' $1`" != "`stat -c '%i' $2`" ] && r=no
echo $r
}
stat -c %d
). 그리고 Linux를 사용하고 있다면 ( stat
명령이 주어지면 ) 쉘은 [ fileA -ef fileB ]
이 모든 것을 직접 수행해야합니다. 또한, 파일 이름이 공백을 포함하거나 사용하여 명령 무상 휴식 \[?*
, 또는 시작이 -
: 항상 명령 susbtitutions 주위에 따옴표를 넣어 ( "$(stat -c %i -- "$1")"
).
function
사용하고 함수 이름이 대시로되어있어 허용되는 이름에 대한 POSIX 규칙을 위반하는 이식 불가능한 키워드를 사용해야 합니까?
$1
하고 $2
. $()
대괄호를 사용하면 명령이 시작되는 위치와 종료 위치 및 중첩이 더 간단 해 지므로 백틱 대신 구문 을 사용할 수도 있습니다 .
첫 번째 포스터에서 알 수 있듯이 Linux에서 다음과 같은 스크립트를 작성할 수 있습니다.
stat -c '%i' fileA fileB fileC
stat -c %d
). 그리고 Linux를 사용하고 있다면 ( stat
명령이 주어지면 ) 쉘은 [ fileA -ef fileB ]
이 모든 것을 직접 수행해야합니다.