두 경로가 동일한 파일을 가리키는 지 확인하십시오.


12

파일을 버전 제어 상태로 유지하기 위해 홈 디렉토리에서 설정 디렉토리에 대한 심볼릭 링크를 재귀 적으로 작성하는 스크립트가 있습니다. 부모 디렉토리를 통해 이미 심볼릭 링크 된 파일을 건너 뛰고 싶습니다. 즉,이 파일 / 디렉토리가있는 경우 :

~/foo/ -> ~/settings/foo/
~/settings/foo/
~/settings/foo/bar

~ / foo / bar 및 ~ / settings / foo / bar가 동일한 파일인지 어떻게 확인합니까?

편집 : D' oh, 몇 분 동안 검색하면 답이 밝혀졌습니다 .readlink -f $path

답변:


6

두 파일이 동일한 deviceID 및 inode를 갖는 경우 동일한 파일입니다. stat명령 행 도구를 찾을 수이 쉽게

if [ "$(stat -c "%d:%i" FILE1)" == "$(stat -c "%d:%i" FILE2)" ]`

...

심볼릭 링크 된 파일 또는 하드 링크 된 파일에 적용됩니다.


5
심볼릭 링크를 따르려면 다음이 필요합니다 stat -L.
Gilles 'SO- 악마 중지

@Gilles가 말했듯이 -L 스위치가 없으면 일부 배포판에서 잘못된 결과를 얻을 수 있습니다.
Olaseni

19

많은 쉘에는 내장 (또는 그 동의어 ) -ef연산자가있어 두 경로가 동일한 기존 파일을 가리키는 지 (심볼릭 링크를 test따라 가는지 [) 테스트합니다 . 여기에는 bash, dash, pdksh, ksh88, ksh93 및 zsh가 포함되지만 POSIX sh는 포함되지 않습니다. bash는, KSH 또는 zsh을, 당신은 또한 사용할 수 있습니다 에 조건부 구조.-ef[[ … ]]

if ! [ "$1" -ef "$2" ]; then # $1 and $2 are different files

1
내 맨 페이지에 따르면 -ef는 Rich Homolka의 답변과 정확히 같은 기능을합니다.
user13852

2
@ user13852 -ef는 휴대 성이 뛰어나다 는 장점이 있습니다 (약간 빠르지 만 대부분의 시간을 알 수는 없습니다). 예를 들어 * BSD, OSX, BusyBox 및 Linux / Cygwin (GNU)에서 작동합니다. 필요한 것을 정확하게 수행하기 때문에 더 명확합니다. 전화를 걸 stat때 볼 수있는 유일한 장점 은 심볼릭 링크를 따르고 싶지 않을 때입니다.
Gilles 'SO- 악마 그만'

0

로 만든 소프트 링크의 경우을 ln -s사용할 수 있습니다 realpath. 그러나 하드 링크에서는 작동하지 않습니다.

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