Encontre links simbólicos [duplicados]

5

No Linux, qual é a melhor maneira de encontrar todos os links simbólicos que apontam para um determinado arquivo (independentemente de o link simbólico ser relativo ou absoluto)? Eu percebo que isso exigirá a verificação de todo o sistema de arquivos.

    
por jrdioko 02.02.2011 / 21:39

2 respostas

7

O GNU find tem o teste -samefile . De acordo com a página man:

-samefile name
    File refers to the same inode as name. When -L is in 
    effect, this can include symbolic links.
$ find -L / -samefile /path/to/file

Isso localizará todos os links para /path/to/file , que inclui links físicos e o próprio arquivo. Se você quiser apenas links simbólicos, poderá testar individualmente os resultados de find ( test -L ).

Você deve ler quais são os efeitos de -L e garantir que ele não cause problemas na sua pesquisa.

Nota: Enquanto a documentação diz que procura por arquivos com o mesmo número de inode, parece funcionar nos sistemas de arquivos.

por exemplo. / home e / tmp são sistemas de arquivos separados

$ touch ~/testfile
$ ln -s ~/testfile /tmp/foo
$ ln -s /tmp/foo /tmp/bar
$ mkdir /tmp/x
$ ln -s ~/testfile /tmp/x/baz
$ find -L /tmp -samefile ~/testfile
/tmp/bar
/tmp/foo
/tmp/x/baz

Note como isso está retornando / tmp / bar, que é um link simbólico para / tmp / foo, que é um symlink para ~ / testfile. Se você quiser apenas encontrar links simbólicos diretos para o seu arquivo de destino, isso não funcionará.

    
por 02.02.2011 / 22:43
0

Talvez o caminho mais curto seja:

target="/usr/bin/firefox"    # change me
dir="/usr/bin"               # change me
realtarget="$(realpath "$target")"
for file in $(find "$dir" -print); do
    realfile="$(realpath "$file")"
    test "$realfile" = "$realtarget" && echo "$file"
done

Mas não é muito eficiente.

Se você não tiver realpath , instale-o, por exemplo %código%. Você também pode usar apt-get install realpath ou stat -N ou ls -l para emular pwd -P , mas essas formas são mais difíceis.

Além disso, o exemplo acima não manipulará nomes de arquivos com espaços corretamente. Aqui está uma maneira melhor de fazer isso. Observe que realpath requer IFS=$'\n' ou bash .

OIFS="$IFS"
IFS=$'\n'
target="/usr/bin/firefox"    # change me
dir="/usr/bin"               # change me
realtarget="$(realpath "$target")"
find "$dir" -print | while read -r file; do
    realfile="$(realpath "$file")"
    test "$realfile" = "$realtarget" && echo "$file"
done
IFS="$OIFS"
    
por 02.02.2011 / 22:22