Comment puis-je supprimer tous les liens symboliques avec une cible spéciale?

Avec la commande:

ls -la * 

Je peux lister tous mes liens symboliques.

Comment supprimer tous les liens symboliques liés à un dossier spécial?

Par exemple:

Dans mon répertoire usr/local/bin Jai les entrées suivantes:

lrwxrwxrwx 1 root root 50 Apr 22 14:52 allneeded -> /usr/local/texlive/2011/bin/x86_64-linux/allneeded lrwxrwxrwx 1 root root 47 Apr 22 14:52 amstex -> /usr/local/texlive/2011/bin/x86_64-linux/amstex lrwxrwxrwx 1 root root 24 Apr 23 19:09 arara -> /home/marco/.arara/arara 

Maintenant, je veux supprimer tous les liens avec le chemin /usr/local/texlive/

Commentaires

  • Voulez-vous dire supprimer tous les liens symboliques liés à un dossier cible? Ou déplacer tous les liens symboliques trouvés dans un dossier spécifique?
  • @uther: je veux dire supprimer les liens.

Réponse

Veuillez vous assurer de lire la réponse alternative . Cest encore plus pertinent bien que pas voté aussi haut à ce stade.

Vous pouvez utiliser ceci pour supprimer tous les liens symboliques:

find -type l -delete 

avec les versions modernes de find.

Sur les anciennes versions de recherche, il se peut que ce soit:

find -type l -exec rm {} \; # or find -type l -exec unlink {} \; 

Pour se limiter à une certaine cible de lien, en supposant quaucun des chemins ne contient de caractère de nouvelle ligne:

 find -type l | while IFS= read -r lnkname; do if [ "$(readlink "$lnkname")" == "/your/exact/path" ]; then rm -- "$lnkname"; fi; done 

ou bien formaté

 find -type l | while IFS= read -r lnkname; do if [ "$(readlink "$lnkname")" = "/your/exact/path" ]; then rm -- "$lnkname" fi done 

Le if pourrait bien sûr également inclure une condition plus complexe telle que la correspondance dun motif avec grep.


Adapté à votre cas:

find -type l | while IFS= read -r lnk; do if (readlink "$lnk" | grep -q "^/usr/local/texlive/"); then rm "$lnk"; fi; done 

ou bien formaté:

find -type l | while IFS= read -r lnk do if readlink "$lnk" | grep -q "^/usr/local/texlive/" then rm "$lnk" fi done 

Commentaires

  • Cette commande supprime-t-elle tous les liens symboliques? Veuillez consulter ma modification ci-dessus ..
  • @ Marco: oui, les trois premières lignes le feraient. Modifier davantage 🙂
  • Jajouterais également un -print à la fin du

pour obtenir un retour visuel.

Réponse

Avec un find moderne qui prend en charge -lname:

find /usr/local/bin -lname "/usr/local/texlive/*" -delete 

devrait faire

Commentaires

  • Cest une excellente et simple solution. Jai testé et ça marche comme un charme. Merci
  • Cela devrait probablement être find /usr/local/bin
  • Pas même moderne, nécessairement. GNU find a eu -lname plus longtemps que je ne lai entretenu (depuis environ 2003).
  • @JamesYoungman: Merci! Par find moderne, je voulais vraiment dire GNU find. 😉 Jai utilisé usr/local/bin, parce que ' est ce que lOP a utilisé.

Réponse

La solution find est excellente.

Juste au cas où votre recherche ne serait pas « t supporte -lname, voici une autre méthode qui utilise uniquement le shell et readlink.

cd /usr/local/bin for f in *; do case "$(readlink "$f")" in /usr/local/texlive/*) rm "$f" ;; esac done 

Réponse

Avec zsh:

rm -f /usr/local/bin(@e"{[[ $REPLY:P = /usr/local/texlive/* ]]}") 

$REPLY:P résout complètement le chemin vers un chemin sans lien symbolique, donc en supposant que /usr/local/texlive est lui-même libre de lien symbolique , cela supprimerait tous les fichiers qui, après la résolution du lien symbolique, vivraient sous /usr/local/textlive qui incluraient des liens vers /usr/local/texlive/foo mais aussi vers ../texlive/bar ou vers /usr/./local/texlive/whatever ou vers /some/other/symlink qui est lui-même un lien symbolique pointant vers /usr/local/texlive, etc.

Réponse

Accédez au chemin et définissez-vous la configuration du chemin

ls -alh|grep "your-pattern-to-file-or-folder-for-symlink"| awk "{print $9}"|xargs rm -rf 

Commentaires

  • Comme il sagit de chemins comme usr/local/bin que grep recherche, grep -E est la voie à suivre. Sinon, il ny aurait pas de résultats correspondants. h dans ls ne ' ne sert à rien ici! -h, --human-readable : with -l, print sizes in human readable format (e.g., 1K 234M 2G). Pour en savoir plus, consultez man ls ou man grep

Réponse

sudo unlink /path/of/your/package

cest tout

Commentaires

  • Comment cela supprime-t-il tous les liens symboliques pointant vers des cibles sous le chemin donné? Notez que la question concerne la suppression des liens symboliques dans un répertoire particulier qui pointe vers des cibles dans un autre répertoire.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *