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