Je voudrais convertir de manière récursive des liens logiciels en liens physiques dans un répertoire. J'ai essayé quelque chose comme ça:
for f in *; do (mv $f{,~} && ln $(readlink $f~) && rm $f~) done
… Mais il a deux problèmes majeurs:
- pas récursif
- récupère les fichiers qui ne sont pas des liens symboliques
Ce serait bien de fournir la ligne ci-dessus find -type l
, mais je ne sais pas comment faire.
bash
find
symbolic-link
Attila O.
la source
la source
cp -aH
). [1]: unix.stackexchange.com/questions/94185/…Réponses:
Cette commande devrait fonctionner:
Comment ça fonctionne:
find -type l
trouve tous les liens dans le répertoire courant.-exec bash -c '...' {} \;
invoque bash pour s'exécuter...
.Il passe
{}
- le nom du lien en cours de traitement - comme argument, auquel bash peut accéder en tant que$0
.readlink -m "$0"
renvoie le chemin absolu de la destination du lien symbolique.ln -f "$(readlink -m "$0")" "$0"
écrase (-f
) le lien symbolique$0
avec un lien dur vers sa cible.Si le lien ne peut pas être converti pour une raison quelconque, il restera intact et ln affichera un message d'erreur.
la source
bash
etln
?-e
commutateur corrige cela.brew install coreutils
etfind * -type l -exec bash -c 'ln -f "$(greadlink -m "$0")" "$0"' {} \;
.