it-swarm.it

Come posso "ricollegare" molti link simbolici non funzionanti?

Ho un albero di directory che ha un sacco di collegamenti simbolici ai file in /home... tuttavia, ho spostato /home per /mnt/home e necessita di un modo per "ricollegare" tutti i collegamenti simbolici. Esiste tale funzionalità o devo scrivere uno script per farlo?

Ad esempio, ho qualcosa di simile al seguente:

[[email protected] ~]# ls -l /mnt/home/someone/something
total 4264
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 a -> /home/someone/someotherthing/a
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 b -> /home/someone/someotherthing/b
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 c -> /home/someone/someotherthing/c
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 d -> /home/someone/someotherthing/d
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 e -> /home/someone/someotherthing/e

/mnt/home/someone/something/subdir:
total 4264
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 a -> /home/someone/someotherthing/subdir/a
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 b -> /home/someone/someotherthing/subdir/b
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 c -> /home/someone/someotherthing/subdir/c
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 d -> /home/someone/someotherthing/subdir/d
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 e -> /home/someone/someotherthing/subdir/e

Voglio un comando che troverà tutti i collegamenti simbolici e ricollegherà negli stessi posti ma sotto /mnt/home invece di /home

Esiste un comando del genere?

55
Josh

Non esiste alcun comando per effettuare il retarget di un collegamento simbolico, tutto ciò che puoi fare è rimuoverlo e crearne un altro. Supponendo di avere GNU (ad es. Con Linux non incorporato o Cygwin), è possibile utilizzare -lname primario di find per abbinare i collegamenti simbolici in base al loro obiettivo e readlink per leggere il contenuto del collegamento. Non testato:

find /mnt/home/someone/something -lname '/home/someone/*' \
     -exec sh -c 'ln -snf "/mnt$(readlink "$0")" "$0"' {} \;

Sarebbe meglio rendere relativi questi collegamenti simbolici. C'è una piccola utility conveniente chiamata symlinks (originariamente di Mark Lords, ora gestito da J. Brandt Buckley), presente in molte distribuzioni Linux. Prima dello spostamento o dopo aver ripristinato i collegamenti validi come sopra, esegui symlinks -c /mnt/home/someone/something per convertire tutti i collegamenti simbolici assoluti nella directory specificata in collegamenti simbolici relativi a meno che non attraversino un limite del filesystem.

So che questo non è esattamente ciò che l'autore sta chiedendo, ma sembra che abbiano già la loro risposta, quindi sto aggiungendo questo per altri come me che si imbattono nella domanda.

Quanto segue dovrebbe aiutare se è necessaria una soluzione più flessibile come avere un sacco di collegamenti simbolici rotti che possono essere riparati sostituendo parte degli obiettivi del collegamento simbolico.

per esempio. Dopo una modifica del nome utente, per sostituire il vecchio nome utente con il nuovo nome utente nella destinazione di molti collegamenti, dopo che la mossa era già stata eseguita. Crea uno script chiamato Replace-simlink mostrato di seguito:

#!/bin/bash
link=$1
# grab the target of the old link
target=$(readlink -- "$1")

# replace the first occurrence of oldusername with newusername in the target string
target=${target/oldusername/newusername}

# Test the link creation
echo ln -s -- "$target" "$link"

# If the above echo shows the correct commands are being issued, then uncomment the following lines and run the command again
#rm "$link"
#ln -s "$target" "$link"

e chiamalo con il seguente comando:

find /home/newusername/ -lname '/home/oldusername/*' -exec ~/bin/replace-simlinks {} \;

Spero che questo aiuti qualcuno

modifica: Grazie Gilles per il kickstart su questo script e per il suggerimento sull'uso dello script symlink per rendere i collegamenti relativi.

13
Gerry

Creare /home come link simbolico a /mnt/home e tutti i collegamenti simbolici esistenti saranno nuovamente validi.

4
Keith Thompson