Linux에서 (심볼릭 링크가 상대적인지 절대적인지에 관계없이) 특정 파일을 가리키는 모든 심볼릭 링크를 찾는 가장 좋은 방법은 무엇입니까? 전체 파일 시스템을 검색해야 한다는 것을 알고 있습니다.
답변1
GNU에는 테스트 find
가 있습니다 -samefile
. 매뉴얼 페이지에 따르면:
-samefile name File refers to the same inode as name. When -L is in effect, this can include symbolic links.
$ find -L / -samefile /path/to/file
/path/to/file
하드 링크와 파일 자체를 포함한 모든 링크를 찾습니다 . 심볼릭 링크만 필요한 경우 find
( )의 결과를 별도로 테스트할 수 있습니다 test -L
.
그 영향을 이해 -L
하고 검색에 문제가 발생하지 않는지 확인해야 합니다.
참고: 문서에는 동일한 inode 번호를 가진 파일을 찾는다고 나와 있지만 파일 시스템 전체에서 작동하는 것 같습니다.
예를 들어 /home과 /tmp는 독립적인 파일 시스템입니다.
$ touch ~/testfile
$ ln -s ~/testfile /tmp/foo
$ ln -s /tmp/foo /tmp/bar
$ mkdir /tmp/x
$ ln -s ~/testfile /tmp/x/baz
$ find -L /tmp -samefile ~/testfile
/tmp/bar
/tmp/foo
/tmp/x/baz
이것이 ~/testfile에 대한 심볼릭 링크인 /tmp/foo에 대한 심볼릭 링크인 /tmp/bar를 어떻게 반환하는지 참고하세요. 대상 파일에 대한 직접 심볼릭 링크를 찾으려는 경우에는 작동하지 않습니다.
답변2
아마도 가장 짧은 방법은 다음과 같습니다.
target="/usr/bin/firefox" # change me
dir="/usr/bin" # change me
realtarget="$(realpath "$target")"
for file in $(find "$dir" -print); do
realfile="$(realpath "$file")"
test "$realfile" = "$realtarget" && echo "$file"
done
하지만 별로 효율적이지 않습니다.
그렇지 않은 경우 realpath
예를 들어 설치하십시오 apt-get install realpath
. 또는 를 사용 하여 시뮬레이션할 수도 있지만 stat -N
이러한 방법은 더 어렵습니다.ls -l
pwd -P
realpath
또한 위의 예에서는 공백이 포함된 파일 이름을 올바르게 처리하지 않습니다. 이것이 더 나은 방법입니다. 또는 IFS=$'\n'
이 필요 합니다 .bash
zsh
OIFS="$IFS"
IFS=$'\n'
target="/usr/bin/firefox" # change me
dir="/usr/bin" # change me
realtarget="$(realpath "$target")"
find "$dir" -print | while read -r file; do
realfile="$(realpath "$file")"
test "$realfile" = "$realtarget" && echo "$file"
done
IFS="$OIFS"