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