J'ai une application web qui a un tas de liens symboliques dans les sous-répertoires tout au long. J'ai besoin de déplacer l'application vers une autre structure de répertoires et je dois mettre à jour tous les liens symboliques pour pointer vers le nouveau chemin. Par exemple:
Ancien Dir: /home/user/public_html/dev
Nouveau Dir: /home/user/public_html/qa
Ancien Symlink: /home/user/public_html/qa/multisites/slave01/images -> /home/user/public_html/dev/images
Nouveau Symlink:/home/user/public_html/qa/multisites/slave01/images -> /home/user/public_html/qa/images
Le problème est qu'il y en a beaucoup dispersés dans divers répertoires. Comment rechercher récursivement à partir de la racine et recréer tous les liens symboliques pointant vers /dev/
avec /qa/
?
la source
find /home/user/public_html/qa/ -type l -lname '/home/user/public_html/dev/*'
ne produit rien.find /home/usr/public_html/qa/ -type l
? Si cela ne trouve pas les liens, quelque chose de très bizarre se passe avec votre système.find /home/user/public_html/qa/ -type l
" affiche les liens. Mais l'ajout du paramètre -lname ne produit rien.Dans le cas où quelqu'un d'autre trouverait ceci lors de la recherche d'une solution: Créez un fichier nommé "linkmod.sh" contenant:
et courir
Vous pouvez ofc utiliser l'option -lname dans find si nécessaire.
REMARQUE: vous devez utiliser 2x \ dans les modèles avant tous les caractères qui nécessitent \ in sed, car echo en supprime un. Par exemple
Supprimez le
echo
de la dernière ligne si les commandes ln sont correctes.la source
echo
dans la dernière ligne du scénario etecho
dans lafind .. | xargs .. linkmod.sh ...
commande elle - même à la fois doivent être enlevés.J'ai créé un script bash
link_rename.sh
pour renommer récursivement les liens symboliques dans un répertoire donnéIl peut être exécuté comme
link_rename.sh /home/human/dir link1 link2
Le script a 3 arguments:
link1
l'ancien modèle qui sera remplacélink2
le nouveau modèle avec lequellink1
sera remplacéLe script lit récursivement tous les liens symboliques du répertoire à l'aide
find "$DIR" -type l
et le traite ligne par ligne.$line
est le lien symbolique qui doit être renomméCUR_LINK_PATH
est l'ancien cheminNEW_LINK_PATH
est obtenu en effectuant le remplacement de chaîne dans l'ancien chemin de liaison.L'ancien lien symbolique est supprimé et un nouveau lien symbolique est créé à l'aide de
ln -s "$NEW_LINK_PATH" "$line"
la source
J'ai fini par écrire un script PHP en ligne de commande qui semble faire l'affaire.
la source