Com o% GNUfind, você pode fazer:
find -L / -xtype l -prune -samefile foo -exec ls -ld {} +
Isso localizará todos os arquivos do tipo symlinks que eventualmente serão resolvidos no mesmo arquivo que foo . Isso também incluirá links simbólicos para links simbólicos ou hardlinks para foo 1 .
Com -L , os links simbólicos são seguidos. Queremos que find arquivos sejam vinculados a foo , mas não queremos seguir o symlink ao descer a árvore de diretórios. Daí o -prune que pára de descer em links simbólicos.
Com zsh , você pode fazer:
ls -ld /**/*(@De:'[[ $REPLY -ef foo ]]':)
Se você está interessado apenas em links simbólicos.
1
Encontrar somente arquivos que são links simbólicos para foo seria mais complicado. O -samefile / -ef compara os números de dispositivo e inode retornados pela chamada de sistema stat() , ou seja, depois que todos os links simbólicos foram solucionados (pelo sistema). O que você deseja é verificar se há links cujo diretório de destino seja igual ao de foo e o nome base seja foo .
Com zsh , isso seria:
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)
Ou com ferramentas GNU ( find e shell ( bash )):
find / -type l \( -lname foo -o -lname '*/foo' \) -printf '%pfind -L / -xtype l -prune -samefile foo -exec ls -ld {} +
%lls -ld /**/*(@De:'[[ $REPLY -ef foo ]]':)
' |
while IFS= read -rd '' file && IFS= read -rd '' link; do
[[ $link = /* ]] || link=${file%/*}/$link
[[ ${link%/*} -ef . ]] && printf '%s\n' "$file"
done