Eu leio "a maioria" das perguntas propostas, mas acredito que todas elas perdem a complexidade da resposta certa.
Eu quero, usando apenas comandos "básicos" (para portabilidade máxima) (isto é, algo que funcionaria no AIX / Linux / etc., não apenas algo usando um nicety recente ^^), para encontrar all os arquivos (links simbólicos, hardlinks e combinações dos mesmos) apontando para um arquivo / diretório específico.
Tenha cuidado para não se apressar em responder find / -ls | grep ....
: ele perderá muitos casos.
Veja meus links abaixo, misturando hardlinks, links simbólicos, caminhos relativos e absolutos (e também reproduza com links simbólicos "././././." Possibilidades)
ou seja
- hardlinks e links simbólicos podem ser "aninhados", ad-inifinitum ...
- alguns links simbólicos podem estar com o caminho completo, outros com um caminho relativo,
- esses caminhos (relativos ou absolutos) podem ser muito complexos (ex: /tmp/././../etc/file)
- um link simbólico pode levar a um arquivo, que é um link para outro, que é um link simbólico para um terceiro, que acaba [depois de mais algumas iterações] para o destino final ...
No final, eu "apenas" preciso descobrir uma maneira de saber qual é o "destino final" de qualquer arquivo / link (ou seja, qual inode será acessado no final? ). Mas é muito difícil (a menos que alguma função mágica me diga "o destino final é: ...". É disso que eu preciso!)
Eu achei que poderia simplesmente usar as opções '-H' ou '-L', mas (provavelmente sou burro ...) não funcionou ... ainda.
Qualquer informação é bem-vinda (mas, por favor, use find / ls / etc, não algum "utilitário legal disponível apenas no linux")
Tente criar alguns links diferentes para o diretório "/ tmp / A" e encontre uma maneira de encontrar e listar todos:
mkdir /tmp/A /tmp/B
ln -s /tmp/A/ /tmp/B/D #absolute symlink, with a training "/"
ln -s ../A /tmp/B/E #relative symlink
ln -s /tmp/A/. /home/F #absolute symlink, with a trailing "/."
ln -s ../tmp/A/./. /var/L #let's get craaaaaaazy! symlinks are "fun"...
ln /tmp/B/D /etc/G #Hard-link to the symlink file /tmp/B/D, which itself symlink to /tmp/A/ witch ends up being the same as "/tmp/A" in most cases.
ln /etc/G /etc/G2 #and a duplicate of the previous one, just to be sure [so /etc/G, /etc/G2, and /tmp/B/D have same inode, but it's a different inode from the final destination... :(
ln -s etc/G /thatsenough #symlink again, for further chaining
e depois algumas tentativas:
find -H / -ls # show inodes of the links and symlinks, not of the "final" directory
find -L / -ls # same thing (I do try that on an OLD AIX ...)
find -H / -inum 123456 -ls #if /tmp/A/. has inode 123456. This lists *only* hardlinks to /tmp/A, ie will only print a subset (and /tmp/A have to be a file in that case)
Eu esperava ver o inode final (123456) na frente de todos os caminhos, em uma dessas invocações (eu também adicionei '-follow' a ambos), mas eu sempre vejo os inodes dos links, não do "destino final" (ou seja, / tmp / A)
O que eu poderia usar para descobrir o "inodo final" que acabo acessando? [o sistema operacional gerencia isso, mas pode um comando "simples" dizer antecipadamente "através do esse arquivo, você abrirá aquele inode final!"]