Mover um arquivo e todos os seus links simbólicos

3

Para os temas de ícones que estou desenvolvendo, tenho arquivos diferentes com um número diferente de links simbólicos colocados em pastas diferentes. Aqui está um exemplo de um deles:

FlatWoken/FlatWoken/scalable/apps$ find -L ../ -samefile bluetooth-active.svg 
../stock/stock_bluetooth.svg
../status/bluetooth-active.svg
../status/blueman-active.svg
../apps/bluetooth-active.svg
../apps/blueradio-48.svg
../apps/bluetooth.svg
../apps/bluedun.svg
../apps/bluetoothradio.svg
../apps/preferences-system-bluetooth.svg
../apps/blueman.svg

O que eu gostaria de fazer é descobrir um comando de terminal que seja capaz de mover todos eles em uma nova pasta (digamos FlatWoken / FlatWoken / 24x24), sem perder os links simbólicos (ou seja, FlatWoken / FlatWoken / 24x24 O /apps/bluedun.svg deve ser linkado para o FlatWoken / FlatWoken / 24x24 / apps / bluetooth-active.svg). É possível fazer isso?

Para mais esclarecimentos, se eu tiver essa estrutura:

alecive@calliope:~/Scrivania/temp$ ls *
dest:
a

orig:
a  b  c
alecive@calliope:~/Scrivania/temp$ ls -l orig/*
orig/a:
totale 0
lrwxrwxrwx 1 alecive alecive 8 apr  9 10:22 link_a -> truefile
-rw-rw-r-- 1 alecive alecive 0 apr  9 10:22 truefile

orig/b:
totale 0
lrwxrwxrwx 1 alecive alecive 13 apr  9 10:23 link_b -> ../a/truefile

orig/c:
totale 0
lrwxrwxrwx 1 alecive alecive 13 apr  9 10:23 link_c -> ../a/truefile

alecive@calliope:~/Scrivania/temp$ ls -l dest/*
dest/a:
totale 0
-rw-rw-r-- 1 alecive alecive 0 apr  9 10:24 truefile

dest/b:
totale 0

dest/c:
totale 0

Eu gostaria de preencher a pasta dest com os links simbólicos que apontam para dest/a/truefile (e não orig/a/truefile ), sem usar o caminho absoluto, mas somente o caminho relativo.

Agradecemos antecipadamente por qualquer ajuda!

    
por alecive 01.04.2014 / 11:57

1 resposta

1

Material avançado . Use a seu risco! Você precisará modificá-lo com certeza. Não use se você não entender.

Se você pode viver com links simbólicos absolutos, você pode fazer isso. Suponha que você comece com isso:

[:~/tmp] % ls -l a b c orig 

a:
total 0
lrwxrwxrwx 1 rmano rmano 16 Apr  1 16:53 linka -> ../orig/truefile

b:
total 0
lrwxrwxrwx 1 rmano rmano 16 Apr  1 16:53 linkb -> ../orig/truefile

c:
total 0
lrwxrwxrwx 1 rmano rmano 16 Apr  1 16:53 linkc -> ../orig/truefile

orig:
total 0
-rw-rw-r-- 1 rmano rmano 0 Apr  1 16:52 truefile

e você deseja mover os links para ./dest ...

Faça o diretório de destino: mkdir dest

então você pode usar este script (salve-o como script.sh, remova o eco no loop for depois de verificar se está fazendo a coisa correta):

#! /bin/bash
#
# $1 is the "true" file name, $2 the dest directory
# note both must exist, no check done! Let as an exrecise!
#
# put absolute path in $absf
absf="$(readlink -f "$1")"
#
# loop over all of the links we found under ".". Avoid the true file. 
# Print instructions; remove the echo if you want to execute them 
# (after checking, rm is not reversible) 
#
for i in $(find -L . -samefile $1 | grep -v $1); do
        echo  ln -s $absf "$2"/"$(basename "$i")"
        echo  rm "$i"
done

... e execute-o como ./script.sh orig/truefile dest/ . Ele irá executar

ln -s /home/rmano/tmp/orig/truefile dest/linkb
rm ./b/linkb
ln -s /home/rmano/tmp/orig/truefile dest/linka
rm ./a/linka
ln -s /home/rmano/tmp/orig/truefile dest/linkc
rm ./c/linkc

e você terá:

[:~/tmp/dest] % cd dest; ls -l 
total 0
lrwxrwxrwx 1 rmano rmano 30 Apr  1 17:19 linka -> /home/rmano/tmp/orig/truefile
lrwxrwxrwx 1 rmano rmano 30 Apr  1 17:18 linkb -> /home/rmano/tmp/orig/truefile
lrwxrwxrwx 1 rmano rmano 30 Apr  1 17:19 linkc -> /home/rmano/tmp/orig/truefile

Se você precisar de um symlink relativo, será mais complexo. Você pode verificar este link para começar a codificar ...

    
por Rmano 02.04.2014 / 01:24