76 votes

Comment convertir un lien symbolique en fichier ordinaire ?

Quel est le moyen le plus direct de convertir un lien symbolique en un fichier ordinaire (c'est-à-dire une copie de la cible du lien symbolique) ?

Supposons que filename est un lien symbolique vers target . La procédure évidente pour le transformer en copie est la suivante :

cp filename filename-backup
rm filename
mv filename-backup filename

Existe-t-il un moyen plus direct (c'est-à-dire une seule commande) ?

1voto

user12702261 Points 11

Changez tous les file.txt du lien en fichier.

for f in *.txt; do echo $(readlink $f) $f | awk '{print "rsync -L "$1" "$2}'; done | bash

0voto

Brian Cain Points 7150

Il n'y a pas de commande unique. Mais si vous ne voulez pas de copie et que tout ce que vous voulez est une autre référence, vous pouvez remplacer le lien symbolique par un lien (alias "lien dur"). Cela ne fonctionne que s'ils sont sur la même partition, BTW.

rm filename
ln target filename

0voto

user3879068 Points 1

Rsync peut naturellement déférencer le lien symbolique pour vous en utilisant l'option -L.

[user@workstation ~]$ rsync -h | grep -- -L
 -L, --copy-links            transform symlink into referent file/dir

Ce serait aussi simple que ça : rsync -L <symlink> <destination>

0voto

Jared Points 336

Cela a parfaitement fonctionné pour moi ( édité pour travailler avec des espaces ) :

find . -type l | while read f; do /bin/cp -rf --remove-destination -f $(find . -name $(readlink "${f}")) "${f}";done;

Permet de convertir récursivement tous les liens symboliques sous le dossier de travail actuel vers son fichier régulier. Ne vous demande pas non plus d'écraser. Le "/bin/cp" existe pour que vous puissiez contourner un éventuel alias cp -i sur votre OS qui empêche le "-rf" de fonctionner.

0voto

ttwhy Points 61

Dans le cas de liens symboliques "relatifs", vous pouvez ajouter une instruction awk à la réponse de @jared :

for f in $(find . -type l); do /bin/cp -rf --remove-destination -f $(find . \! -type l -name $(readlink $f | awk -F"../" '{print $NF}')) $f;done;

Si vous avez des liens symboliques pointant vers des répertoires, vous devez utiliser une approche plus radicale car cp --remove-destination ne fonctionne pas correctement avec les liens symboliques vers les répertoires.

for f in `find . -type l`; do (cd `dirname $f`; target=`basename $f`; source=`readlink $target` ; rm -rf $target && cp -r $source $target); done

Il est certain que ce texte pourrait être écrit avec moins de frais généraux, mais il est très agréable à lire, à mon avis.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X