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

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

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

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

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

편집하다: 아, 몇 분 더 검색해보니답변:readlink -f $path

답변1

두 파일의 deviceID와 inode가 동일하면 동일한 파일입니다. 명령 stat줄 도구를 사용하면 이를 쉽게 찾을 수 있으며 이 솔루션은 POSIX 셸과 호환됩니다.

if [ "$(stat -L -c %d:%i FILE1)" = "$(stat -L -c %d:%i FILE2)" ]; then
  echo "FILE1 and FILE2 refer to a single file, with one inode, on one device."
else
  echo "no match"
fi

-L각각의 플래그는 이것이 stat심볼릭 링크된 파일과 하드 링크된 파일 모두에 대해 작동함을 의미합니다.

답변2

많은 쉘에는 -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

답변3

(으로 생성된 ln -s) 소프트링크의 경우 을 사용할 수 있습니다 realpath. 하지만 하드링크에서는 작동하지 않습니다.

관련 정보