Existe uma maneira de verificar se há links simbólicos apontando para um diretório?
Pergunta
Eu tenho uma pasta no meu servidor para o qual eu tinha um número de links simbólicos apontando. Eu já criou uma nova pasta e eu quero mudar todos esses links simbólicos para apontar para a nova pasta. Eu tinha considerado substituindo a pasta original com um link simbólico para a nova pasta, mas parece que se eu continuasse com essa prática poderia ficar muito confuso muito rápido.
O que eu tenho feito é mudar manualmente os links simbólicos para apontar para a nova pasta, mas pode ter perdido um casal.
Existe uma maneira de verificar se existem links simbólicos apontando para uma pasta específica?
Solução
Eu usaria o comando find.
find . -lname /particular/folder
Isso irá recursivamente procurar o diretório atual para links simbólicos para /particular/folder
. Note-se que só vai encontrar links simbólicos absolutos. Um comando semelhante pode ser usado para procurar por todos os links simbólicos apontando para objetos chamados "pasta":
find . -lname '*folder'
A partir daí você precisa eliminar quaisquer falsos positivos.
Outras dicas
Você pode auditar links simbólicos com o programa symlinks
escrito por Mark Senhor - ele fará a varredura de um sistema de arquivos inteiro, caminhos normalize link simbólico para forma absoluta e imprimi-los na saída padrão.
Não há realmente nenhuma maneira direta para verificar se tais links simbólicos. Considere que você pode ter um sistema de arquivos que não está montado o tempo todo (ex. Uma unidade USB externa), o que poderia conter links simbólicos para outro volume no sistema.
Você poderia fazer algo com:
for a in `find / -type l`; do echo "$a -> `readlink $a`"; done | grep destfolder
Faço notar que find
do FreeBSD não suporta a opção -lname
, que é por isso que eu acabei com o acima.
find . -type l -printf '%p -> %l\n'
Além de olhar para todas as outras pastas se existem links que apontam para a pasta original, eu não acho que isso é possível. Se for, eu estaria interessado.
find / -lname 'fullyqualifiedpathoffile'
find /foldername -type l -exec ls -lad {} \;
Para hardlinks, você pode obter o inode do diretório com um dos "ls" opções (-i
, eu acho).
Em seguida, um find
com -inum
irá localizar todos os hardlinks comuns.
Para softlinks, você pode ter que fazer um ls -l
em todos os arquivos que procuram o texto após "->". E normalizando-lo para ter certeza que é um caminho absoluto