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