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) ?

7voto

Paul Beusterien Points 8051

Sur OSX

rsync `readlink bar.pdf` bar.pdf

3voto

Andrii Radyk Points 396

cp peut supprimer le fichier de destination :

cp --remove-destination target filename

3voto

Trevor Hickey Points 3369

Beaucoup ont déjà énoncé la solution suivante :

cp --remove-destination `readlink file` file

Toutefois, cela ne fonctionnera pas sur les répertoires liés symboliquement.

Ajout d'un récursif y force ne fonctionnera pas non plus :

cp -rf --remove-destination `readlink file` file

cp : impossible de copier un répertoire, 'path/file, dans son propre répertoire, 'file'.

Par conséquent, il est probablement plus sûr de supprimer entièrement le lien symbolique d'abord :

resolve-symbolic-link() {
  if [ -L $1 ]; then
      temp="$(readlink "$1")";
      rm -rf "$1";
      cp -rf "$temp" "$1";
  fi
}

Ce n'est pas exactement une phrase toute faite comme vous l'aviez espéré, mais mettez-la dans votre environnement shell, et ça peut le devenir.

3voto

Cette solution fonctionne avec les fichiers de liens symboliques et les dossiers/sous-dossiers de liens symboliques.

Une ligne, pas de script nécessaire. Ce serait idéal pour exporter ou transférer des liens symboliques ailleurs.

Mettez tout dans un dossier.

rsync --archive --copy-links --recursive folderContainingSymlinkFilesAndSymlinkFoldersAndSubfolders monNouveauDossier

1voto

BANZ1111 Points 11

Une autre approche si vous vous trouvez à faire cela souvent est d'adapter la réponse de kbrock dans un script shell et de le mettre dans /usr/bin/. Quelque chose du genre de :

if [ $# -ne 1 ] 
then
  echo "Usage: $0 filename"
  exit 1
fi
[ -L "$1" ] && cp --remove-destination "$(readlink "$1")" "$1"

chmod +x, et ensuite l'exécuter comme une commande normale.

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