Remplacer les liens symboliques par des fichiers

Existe-t-il un moyen simple de remplacer tous les liens symboliques par le fichier auquel ils se lient?

9 Solutions collect form web for “Remplacer les liens symboliques par des fichiers”

Pour certaines définitions de «facile»:

#!/bin/sh set -e for link; do test -h "$link" || continue dir=$(dirname "$link") reltarget=$(readlink "$link") case $reltarget in /*) abstarget=$reltarget;; *) abstarget=$dir/$reltarget;; esac rm -fv "$link" cp -afv "$abstarget" "$link" || { # on failure, restore the symlink rm -rfv "$link" ln -sfv "$reltarget" "$link" } done 

Exécutez ce script avec les noms de liens comme arguments, par exemple via la find . -type l -exec /path/tos/script {} + find . -type l -exec /path/tos/script {} +

Peut être plus facile d'utiliser simplement le goudron pour copier les données dans un nouveau répertoire.

 -H (c and r mode only) Symbolic links named on the command line will be followed; the target of the link will be archived, not the link itself. 

Vous pourriez utiliser quelque chose comme ça

 tar -hcf - sourcedir | tar -xf - -C newdir tar --help: -H, --format=FORMAT create archive of the given format -h, --dereference follow symlinks; archive and dump the files they point to 

Si je vous ai bien compris, le drapeau -L de la commande cp devrait faire exactement ce que vous voulez.

Il suffit de copier tous les liens symboliques et il les remplacera par les fichiers qu'ils indiquent.

"Facile" sera fonction de vous, très probablement.

Je voudrais probablement écrire un script qui utilise l'utilitaire de ligne de commande "find" pour trouver des fichiers symboliquement liés, puis appelle rm et cp pour supprimer et remplacer le fichier. Vous feriez probablement bien de faire en sorte que l'action appelée par find vérifie qu'il reste assez d'espace libre avant de déplacer le lien sym.

Une autre solution peut être de monter le système de fichiers en question à travers quelque chose qui masque les liens de sym (comme samba), puis tout simplement copier tout. Mais dans de nombreux cas, quelque chose comme ça introduirait d'autres problèmes.

Une réponse plus directe à votre question est probablement «oui».

Modifier: selon la demande d'informations plus spécifiques. Selon la page de manuel pour la recherche , cette commande répertorie tous les fichiers de liens de symbole dans une profondeur de 2 répertoires, à partir de /:

 find / -maxdepth 2 -type l -print 

( Cela a été trouvé ici )

Pour trouver une solution pour l'exécuter:

 find / -maxdepth 2 -type l -exec ./ReplaceSymLink.sh {} \; 

Je crois que j'appellerai un script que je viens de faire, et que je passe le nom de fichier que vous venez de trouver. Alternativement, vous pouvez capturer la sortie de recherche dans le fichier (utilisez "trouver [blah]> symlinks.data", etc.) puis passez ce fichier dans un script que vous avez écrit pour gérer la copie sur l'original gracieusement.

 find . -type l -exec cp --dereference --recursive '{}' '{}'.dereferenced \; 

Fera une copie de chaque fichier / dossier symétrique dans <filename>.dereferenced , qui est plus sûr (si moins pratique) que de simplement les remplacer directement. Déplacer les données copiées vers les noms de fichiers des liens symboliques est laissé comme un exercice pour le lecteur.

En utilisant certaines des idées précédentes, la commande suivante remplacera de manière récurrente chaque lien symbolique par une copie de l'original:

 find . -type l -exec bash -c "echo 'Replacing {} ...'; cp -LR '{}' '{}'.dereferenced; rm '{}'; mv '{}'.dereferenced '{}'" \; 

Beaucoup de bonnes réponses là-bas, mais je, depuis que vous cherchiez quelque chose de simple

 for i in *; do link=$(readlink $i) && rm $i && mv $link $i; done 

J'ai eu le même problème avec gwenview copiant des liens lorsque vous vous attendiez normalement à suivre le lien et à copier le fichier.

Ce que j'ai fait pour "nettoyer" le répertoire en suivant tous les liens et en copiant tous les fichiers pointu vers le répertoire, a été créer un répertoire de scratch, exécutez par exemple

 "for file in `ls`; do cp -L $file scratchdir/$file; done; mv scratchdir/* ./" 

C'est trop dangereux pour mettre un script car il n'y a pas de vérification, mais cela a réglé mon problème.

J'ai fait une version en ligne, puisque mon hôtel ne permit pas les scénarios bash et ça m'a bien fonctionné:

 before: > find . -type l | wc -l 358 > for link in `find . -type l` ; do echo "$link : "; ls -al $link ; cp $link notalink; unlink $link; mv notalink $link ; ls -al $link; done ... after: > find . -type l | wc -l 0 
  • Utilisation du bureau comme fausse webcam sur linux
  • HDD IO errors, est-ce définitivement une panne HDD ou pourrait-il être autre chose? Kernel.log
  • Comment puis-je énumérer les autorisations de chaque composant dans un chemin de fichier?
  • Obtenir un répertoire personnel par nom d'utilisateur
  • Supprimer ou renommer un fichier avec \ r comme nom de fichier
  • Time Machine sur Ubuntu?
  • Comment puis-je redémarrer un écran gelé dans Ubuntu sans perdre de fenêtre ouverte?
  • Comment puis-je imaginer un disque dur plusieurs fois simultanément?
  • Utiliser l'ordinateur portable comme écran distant pour linux
  • Clear stdin avant de lire
  • Choix du système de fichiers pour GNU / Linux sur une carte SD
  • Soyons le génie de l'ordinateur et du réseau.