現在のファイルにリンクがあることを確認する

現在のファイルにリンクがあることを確認する

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

おすすめ記事