J'ai un répertoire qui contient des liens symboliques:
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
J'ai besoin de les copier dans le répertoire actuel. Les liens résultants doivent être indépendants de leurs prototypes et mener directement aux objets cibles.
cp -s
crée des liens vers des liens dont le comportement n'est pas approprié.cp -s -L
refuse de copier des liens vers des répertoirescp -s -L -r
refuse de copier les liens relatifs dans un répertoire qui ne fonctionne pas
Que devrais-je faire?
linux
command-line
symbolic-link
cp
Basilevs
la source
la source
cp -d
fait le travail de mon côté.cp -R
sur un macRéponses:
De la page de manuel:
Personnellement, je l’utilise
cp -av
pour la plupart de mes gros travaux de copie. De cette façon, je peux tout conserver - même de manière récursive - et voir la sortie. Bien sûr, ce ne sont que des préférences personnelles.En ce qui concerne la raison pour laquelle vos autres options ne répondent pas à vos attentes,
-s
crée un lien au lieu de les copier et-L
suit les liens dans la source pour trouver le fichier à copier au lieu de copier les liens eux-mêmes.la source
-R
, car sinon cp ignorera les répertoires et les liens symboliques vers les répertoires.cp -a
-a
option. Heh, j'ai regardé les options danscp
la page de manuel de Saintes fois, mais j'ai toujours dû survoler celle-ci. J'ai utilisé jusqu'à présent-dpr
, mais-a
couvre tout cela, plus la préservation de quelques autres attributs. Si j'avais eu besoin de ces autres attributs, j'aurais probablement encore regardé l'--preserve
option et l'utilisé-dr --preserve=all
, ce qui est exactement ce qui-a
est! Au moins, je sais maintenant --a
c’est parfait et c’est ce que je vais utiliser à partir de maintenant.--preserve=links
n'était pas suffisant. C'est toujours ditcp: omitting directory
. Mais-av
travaillé.Comme le dit la page de manuel, utilisez
-P
.la source
-P
ne fonctionne pas sur les répertoires alors j'ai utilisécp -a
cp -P
contrairement à la réponse par plus de votes des œuvres @kainosnous pour moi. Merci!Si les liens contiennent des chemins relatifs, la copie du lien ne modifiera pas le chemin relatif. Utilisez
readlink
, avec le commutateur-f
à suivre récursivement, afin d’obtenir le chemin absolu du lien. Par exemple:Si la préservation des chemins relatifs est ce que vous voulez, que l'option
-P
decp
, comme le dit Ignacio Vazquez-Abrams, est ce que vous avez besoin.la source
/usr/share/dict/words -> /etc/dictionaries-common/words -> /usr/share/dict/british-english
spécifie le dictionnaire préféré. Si vous deviez déréférencer cette chaîne de manière récursive, le lien symbolique résultant ignorerait les modifications ultérieures apportées à cette préférence.Comme quelques-uns l'ont commenté:
fonctionne bien.
De l'homme:
la source
La plupart du temps, lorsque je dois copier de nombreux liens symboliques, j'essaie en fait de refléter une arborescence de répertoires. Donc, je veux les liens symboliques et tout le reste.
C'est excessif pour la copie de quelques liens symboliques, mais si vous essayez de copier un arbre entier, cela peut être très utile:
Utilisez du goudron .
tar ne résout pas le lien symbolique par défaut, de sorte que les liens symboliques dans la copie miroir pointent vers les mêmes emplacements que ceux de l'arborescence d'origine.
Cette astuce utilise des sous-shell pour mettre en miroir la commande tar à la racine du répertoire. vous pouvez en laisser un (ainsi que la commande cd associée ) si vous vous trouvez déjà dans les répertoires src ou dest :
Encore une fois, cela ne convient pas à chaque fois que vous voulez copier des liens symboliques, mais c'est un extrait de code très utile à connaître.
la source
J'ai utilisé ce qui suit pour dupliquer un très grand répertoire. Tous les liens symboliques ont été préservés, la copie a été réalisée de manière récursive et j'ai pu obtenir un retour visuel du processus:
la source
Essayez: cp -pr symlink destination
OS - Centos 5 (Linux)
la source
Sur Ubuntu lors de la copie de liens et de fichiers dans un répertoire:
la source
cp -d
est le raccourci pour celacp -a
etcp --preserve=links
font plus que la question se pose. Si je comprends bien, c’est la bonne réponse pour quiconque l’utilisecp
, bien que le fait de ne traiter que des fichiers (pas de répertoires) comme dans la question--no-dereference
n’aurait aucun effet.Utilisez l'
-P
option, comme Ignacio Vazquez-Abrams a écrit ci - dessus . Ce qu'il n'a pas mentionné est-P
sans effet-R
. Donc il faut au moinscp -RP
.(Le site ne me permet pas encore de commenter, alors j'ai posté une réponse séparée.)
la source
cp -s et cp -L sont des commandes spéciales. Pour votre besoin, n'utilisez aucun.
Par exemple, copier un répertoire DIR contenant a et un lien symbolique b pointant vers a.
Ce dont vous avez besoin, c'est N / a (= DIR / a) et N / b -> ../ N / a; il suffit donc de copier sans dereferencing, en utilisant l'option cp -P. Je crois que c’est aussi la valeur par défaut pour cp.
se référer
man cp
oucp --help
pour plus d'options.la source