2010-05-07 04:36:38 +0000 2010-05-07 04:36:38 +0000
188
188

Come copiare i link simbolici?

Ho una directory che contiene alcuni link simbolici:

user@host:include$ find .. -type l -ls
4737414 0 lrwxrwxrwx 1 user group 13 Dec 9 13:47 ../k0607-lsi6/camac -> ../../include
4737415 0 lrwxrwxrwx 1 user group 14 Dec 9 13:49 ../k0607-lsi6/linux -> ../../../linux
4737417 0 lrwxrwxrwx 1 user group 12 Dec 9 13:57 ../k0607-lsi6/dfc -> ../../../dfc
4737419 0 lrwxrwxrwx 1 user group 17 Dec 9 13:57 ../k0607-lsi6/dfcommon -> ../../../dfcommon
4737420 0 lrwxrwxrwx 1 user group 19 Dec 9 13:57 ../k0607-lsi6/dfcommonxx -> ../../../dfcommonxx
4737421 0 lrwxrwxrwx 1 user group 17 Dec 9 13:57 ../k0607-lsi6/dfcompat -> ../../../dfcompat
``` &001 


Ho bisogno di copiarli nella directory corrente. I link risultanti dovrebbero essere indipendenti dai loro prototipi e condurre direttamente ai loro oggetti di destinazione. 


- `cp -s` crea link a link che non è un comportamento appropriato. 
- `cp -s -L` rifiuta di copiare link a directory 
- `cp -s -L -r` rifiuta di copiare link relativi a directory non funzionanti 


Cosa devo fare?

Risposte (10)

212
212
212
2010-05-07 05:02:45 +0000
cp --preserve=links

Dalla pagina uomo:

--preserve[=ATTR_LIST]
          preserve the specified attributes (default: mode,owner-
          ship,timestamps), if possible additional attributes: context,
          links, xattr, all
``` &001 


Personalmente, uso `cp -av` per la maggior parte delle mie copiature pesanti. In questo modo, posso conservare tutto - anche in modo ricorsivo - e vedere l'uscita. Naturalmente, questa è solo una preferenza personale. 


Per quanto riguarda il motivo per cui le altre opzioni non hanno fatto quello che vi aspettavate, `-s` fa un link _invece di copiare e `-L` segue i link nel sorgente per trovare il file da copiare invece di copiare i link stessi.
47
47
47
2010-05-07 04:39:24 +0000

Proprio come dice la pagina dell'uomo, usa -P.

30
30
30
2010-05-07 05:09:01 +0000

Se i link contengono percorsi relativi, allora, copiando il link non si modifica il percorso relativo. Usare readlink, con lo switch -f da seguire ricorsivamente, per ottenere il percorso assoluto del link. Per esempio:

ln -s $(readlink -f old/dir/oldlink) new/dir/newlink
``` &001 


Se si vogliono conservare i percorsi relativi, allora l'opzione `-P` di `cp`, come detto da Ignacio Vazquez-Abrams, è ciò che serve.
24
24
24
2015-01-27 14:51:13 +0000

Come alcuni hanno commentato:

cp -a
``` ```
-a same as -dR --preserve=all

-R copy directories recursively
-d same as --no-dereference --preserve=links
--no-dereference never follow symbolic links in SOURCE

funziona bene.

Dall'uomo:

&001

11
11
11
2012-05-15 17:25:32 +0000

Ho usato quanto segue per duplicare una directory molto grande. Tutti i link simbolici sono stati conservati, la copia è stata fatta in modo ricorsivo e sono stato in grado di avere un feedback visivo del processo:

cp -Prv /sourcer_dir/* /target_dir
11
11
11
2010-05-07 06:03:32 +0000

La maggior parte delle volte, quando ho bisogno di copiare molti link simbolici, sto in realtà cercando di rispecchiare un albero di directory. Quindi voglio i link simbolici e tutto il resto.

Questa è un'esagerazione per copiare solo pochi link simbolici, ma se si sta effettivamente cercando di copiare un intero albero, questo può essere molto utile:

Usa tar.

user@host:/cwd$ ( cd /path/to/src ; tar cf - . ) | ( cd /path/to/dest ; tar xf - )
``` ```
# already in src?
user@host:/src$ tar cf - . | ( cd /path/to/dest ; tar xf - )

# already in dest?
user@host:/dest$ ( cd /path/to/src ; tar cf - . ) | tar xf - 

# just need src/foo?
# this result will be a mirror copy at dest/foo 
user@host:/src$ tar cf - foo | ( cd /path/to/dest ; tar xf - )

# mirror to another system?
user@host:/src$ tar cf - . | ssh user@example.com '( cd /path/to/dest ; tar xf - )'

tar non risolve il link simbolico di default, quindi i link simbolici nella copia speculare puntano alle stesse posizioni di quelli dell'albero originale.

Questo trucco fa uso di sottogusci per portare il comando tar nella posizione alla radice della directory da rispecchiare; si può lasciare fuori uno di questi (insieme al comando cd associato) se si è già nella directory src o dest:

&001 &001

Anche in questo caso, non è appropriato per ogni volta che si desidera copiare i collegamenti simbolici, ma è un frammento molto utile da conoscere.

4
4
4
2011-07-27 13:15:51 +0000

Prova: cp -pr symlink destinazione

[root@station1 temp]# ls -l
total 8
-rw-r--r-- 1 root root 0 Jul 27 18:40 abc
lrwxrwxrwx 1 root root 13 Jul 27 18:41 abc.link1 -> /tmp/temp/abc
[root@station1 temp]# cp -rp /tmp/temp/abc.link1 /tmp/temp/abc.link2
[root@station1 temp]# ls -l
total 12
-rw-r--r-- 1 root root 0 Jul 27 18:40 abc
lrwxrwxrwx 1 root root 13 Jul 27 18:41 abc.link1 -> /tmp/temp/abc
lrwxrwxrwx 1 root root 13 Jul 27 18:42 abc.link2 -> /tmp/temp/abc
[root@station1 temp]#

OS - Centos 5 (Linux)

3
3
3
2015-12-01 12:51:43 +0000

Su Ubuntu quando si copiano link e file in una directory:

cp --no-dereference --preserve=links
2
2
2
2019-01-12 17:55:13 +0000

Utilizzare l'opzione -P, come ha scritto Ignacio Vazquez-Abrams sopra . Quello che non ha menzionato è -P non ha alcun effetto senza -R. Quindi è necessario almeno cp -RP.

(Il sito non mi permette ancora di commentare, quindi ho postato una risposta a parte).

1
1
1
2018-06-26 03:24:57 +0000

cp -s e cp -L sono comandi speciali. Per le vostre esigenze, usate nessuno.

ad esempio copiando una directory DIR contenente a e un link simbolico b che punta ad a.

  • cp -s DIR/* N/ crea un link simbolico invece di copiare, N/a->../DIR/a (link) e N/b->(. ./DIR/b) che è un link a un link
  • cp -L DIR/* N/ copia con dereferencing del link, N/a, N/b (come DIR/a)

Quello che serve è N/a(=DIR/a), e N/b->../N/a; quindi basta copiare senza dereferencing, usando l'opzione cp -P. Credo che questa sia anche l'opzione predefinita per cp.

  • -P no-dereference, preserve links
  • -d combina l'opzione -P con -p per preservare=mode, ownership, timestamps
  • - -a combina l'opzione -d con -R per copiare ricorsivamente le directory

refer man cp o cp --help per ulteriori opzioni.