Linux에서 현재 파일에 링크가 있는지 확인하는 방법은 무엇입니까? 내가 가지고 있는 것:
touch foo
ln -s foo bar
ll foo bar
bar -> foo
foo
이제 다음에서 링크된 파일이 있는지 알고 싶습니다 foo
. 예:
$magic-command foo
foo<-bar
답변1
GNU를 사용하면 find
다음을 수행할 수 있습니다.
find -L / -xtype l -prune -samefile foo -exec ls -ld {} +
이는 궁극적으로 로 확인되는 심볼릭 링크 유형의 모든 파일을 찾습니다 foo
. 여기에는 심볼릭 링크에 대한 심볼릭 링크 또는 foo
1 에 대한 하드 링크 도 포함됩니다.
의 경우 -L
기호 링크가 이어집니다. 우리는 그것이 find
링크된 파일에 링크 되기를 원 foo
하지만 디렉토리 트리를 따라 내려갈 때 심볼릭 링크를 따르고 싶지는 않습니다. 따라서 -prune
더 이상 심볼릭 링크로 떨어지지 않습니다.
를 사용하면 zsh
다음을 수행할 수 있습니다.
ls -ld /**/*(@De:'[[ $REPLY -ef foo ]]':)
심볼릭 링크에만 관심이 있는 경우.
1개
발견됨오직심볼릭 링크 파일은 foo
더 복잡합니다. -samefile
/ -ef
시스템 호출에서 반환된 장치 번호와 inode 번호를 비교합니다 stat()
.모두심볼릭 링크가 (시스템에 의해) 해결되었습니다. 당신이 원하는 것은 foo
대상 디렉토리가 기본 이름이 foo
.
그래 zsh
그거야:
zmodload zsh/zstat
links_to_thefile() {
local file link
file=${1-$REPLY}
zstat -L -A link +link -- $file || return
[[ $link:t = $thefile:t ]] || return
case $link in
(/*) file=$link;;
(*) file=$file:h/$link
esac
[[ $file:h -ef $thefile:h ]]
}
thefile=foo
ls -ld /**/*(@D+links_to_thefile)
또는 GNU 도구( find
및 쉘( bash
))를 사용하십시오.
find / -type l \( -lname foo -o -lname '*/foo' \) -printf '%p\0%l\0' |
while IFS= read -rd '' file && IFS= read -rd '' link; do
[[ $link = /* ]] || link=${file%/*}/$link
[[ ${link%/*} -ef . ]] && printf '%s\n' "$file"
done
답변2
stat
심볼릭 링크는 계산하지 않고 하드 링크는 계산합니다. 도움이 된다면 말이죠.