Atualizar links simbólicos por script? [duplicado]

0

Eu tenho um diretório que contém muitos symlinks que apontam para outros diretórios. Agora gostaria de renomear um diretório ancestral comum dos diretórios vinculados pelos links simbólicos e também ter links simbólicos apontando para os mesmos diretórios, exceto com nomes de caminho renomeados. Por exemplo, os links simbólicos apontam para /home/Tim/dir1 , /home/Tim/dir2 , ... e agora eu gostaria que os links simbólicos apontassem para /data/Tim/dir1 , /data/Tim/dir2 , ....

Eu gostaria de automatizar o processo de atualização dos links simbólicos. Mas há várias perguntas:

  1. Ouvi dizer que os links simbólicos não podem ser editados. Então, eu tenho que criar novos links simbólicos e, em seguida, substituir os existentes?

  2. como posso obter o nome do caminho do diretório apontado por um link simbólico e, em seguida, usar alguns programas de processamento de texto para substituir o antigo nome do diretório ancestral nos nomes de caminho e criar um link simbólico para o diretório com um novo nome de caminho? Obrigado.

por Tim 04.03.2015 / 06:23

1 resposta

2

I heard that symlinks can't be edited. So do I have to create new symlinks and then overwrite the existing ones?

Os links simbólicos não podem ser editados, isso está correto. Você pode substituir links simbólicos para arquivos em uma única operação com a opção -f para ln , e se você adicionar -T você pode processar links simbólicos para diretórios da mesma maneira:

ln -sfT /data/Tim/dir1 symlink1

criará symlink1 apontando para /data/Tim/dir1 , substituindo qualquer link simbólico existente (ou arquivo!) denominado symlink1 .

how can I get the pathname of the directory pointed to by a symlink, and then use some text processing programs to replace the old name of the ancestral directory in the pathnames with its new name, and create a symlink pointing to the directory with a new pathname?

realpath fornecerá o caminho absoluto para o qual o link simbólico aponta. Para processar seus links simbólicos:

for symlink in *; do
    if [ -L "${symlink}" ]; then
        origpath="$(realpath "${symlink}")" && ln -sfT "${origpath/home/data}" "${symlink}"
    fi
done

Isso recupera o caminho de cada arquivo no diretório atual (presumo que todos os links simbólicos no diretório atual precisam ser corrigidos) e o vincula novamente, substituindo a primeira ocorrência de home por data . Usar && garante que o link simbólico só será substituído se realpath tiver êxito (ele falhará se o destino não existir).

    
por 04.03.2015 / 06:46

Tags