link simbólico novo alvo

3

Eu quero alterar os links simbólicos apontando para o diretório atual, para um diretório comum chamado / pool

diretório atual a / b diretório comum a / pool

Eu segui todos os que consegui encontrar e cheguei perto com este script.

#!/bin/sh
from="$1"
to="$2"
shift 2
for i
do
  a=$(readlink "$i") && ln -sf "$(echo $a | sed "s@$from@$to@")" "$i"
done

antes de executar o script ...

lrwxrwxrwx 1 neysa neysa  18 Jan  4 22:03 xfsm-logout.png -> system-log-out.png
lrwxrwxrwx 1 neysa neysa  17 Jan  4 22:03 zoom-best-fit.png -> zoom-fit-best.png

depois de executar o script     ./rename-links. ../ pool /

lrwxrwxrwx 1 neysa neysa  25 Jan  4 22:31 xfsm-logout.png -> ../pool/ystem-log-out.png
lrwxrwxrwx 1 neysa neysa  24 Jan  4 22:31 zoom-best-fit.png -> ../pool/oom-fit-best.png

está funcionando, mas com uma falha, falta a primeira letra do alvo. O que estou fazendo errado?

    
por Babu Philip 04.01.2015 / 18:06

1 resposta

1

. é um metacaractere de expressão regular em sed , que corresponde a qualquer caractere único. Como você insere o caminho $from diretamente na expressão regular, o . está lá como se você tivesse escrito:

sed "s@.@../pool/@"

você mesmo. Que substitui qualquer caractere único, uma vez, com " ../pool/ " , então tem o efeito de deletar o primeiro caractere e inserir "../pool/" em seu lugar.

Se você executar o comando readlink manualmente, verá que ./ não faz parte do conteúdo do link - seu ls mostra o mesmo.

Você precisará, pelo menos, de um caso especial " . " no seu script, pois ele pode ou não estar presente no conteúdo do link. Uma opção é usar readlink -f no link e . - que lhe dará caminhos absolutos ambos - mas existem opções mais simples se você tiver apenas um caso para lidar.

Se você estiver em bash , pode sair sem sed usando expansão básica de parâmetro :

ln -sf "${a/$from/$to}" "$i"

Isso substituirá a expansão de $from pela expansão de $to em $a , com . tratado literalmente (embora * e outros shell metacaracteres sejam usados - realmente deve ser "${a/"$from"/"$to"}" para evitar isso). Esta é uma maneira mais limpa e simples de fazer isso em geral.

    
por 04.01.2015 / 20:06

Tags