현재 파일에 링크가 있는지 확인

현재 파일에 링크가 있는지 확인

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. 여기에는 심볼릭 링크에 대한 심볼릭 링크 또는 foo1 에 대한 하드 링크 도 포함됩니다.

의 경우 -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심볼릭 링크는 계산하지 않고 하드 링크는 계산합니다. 도움이 된다면 말이죠.

문의하신 문제는 해결방법이 없습니다.

관련 정보