Le moyen le plus simple de restaurer des liens symboliques convertis en fichiers texte?

1

J'avais des dossiers avec de nombreux liens symboliques. Malheureusement, après avoir copié cela autour de différents systèmes de fichiers, ils se sont transformés en fichiers de texte brut avec le lien cible comme contenu. C'est:

Avant

$ ll link
... link -> /path/to/target

Après

$ cat link
/path/to/target

Quel est le moyen le plus simple de restaurer ce lien? Peut-être un one-liner ou un script shell.

Supposons que j'ai des centaines de liens comme celui-ci, y at-il un moyen de les restaurer tous, sans exécuter manuellement le correctif sur chacun d'eux?

congusbongus
la source
Être à l'aise avec debugfs. Essayez de ne pas causer trop de dégâts ...
Ignacio Vazquez-Abrams
debugfsn'est absolument pas le bon outil à utiliser ici.
wingedsubmariner
Par curiosité, entre quels systèmes de fichiers avez-vous copié et quels outils avez-vous utilisés?
wingedsubmariner

Réponses:

1

Utilisez cette commande:

ls *txt | xargs -I R1 sh -c "cat R1 | xargs -I R2 ln -sf R2 R1"

Remplacez ls *txtpar quelque chose qui va générer la liste des fichiers texte qui doivent être des liens symboliques. Par exemple, find . -name "*txt"listerait tous les fichiers * txt dans ou sous le répertoire actuel.

Wingedsubmariner
la source
1

Essaye ça:

ls * | while read f; do
  ln -sf "$(cat $f)" "$f" 
done

comme dans la réponse de wingedsubmariner, ls *devrait être remplacé par quelque chose qui listera exactement les fichiers que vous vouliez.

Je trouve le

ls * | while read f; do
  # command executed for each file
done

construire très utile. Comme je le sais, c’est la bonne façon de gérer tous les noms de fichiers. Par exemple, si un nom de fichier contient des espaces, "$ f" fonctionnera toujours (contrairement à avec for f in $(ls *); do...done).

FYI: $ (cmd) est identique à cmdmais il peut être imbriqué contrairement à ``.

Emil Vatai
la source