web-dev-qa-db-fra.com

Comment 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 J'ai 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/

46
Marco Daniel

Veuillez vous assurer de lire la réponse alternative. C'est encore plus vrai, bien que le vote ne soit pas aussi élevé à ce stade.

Vous pouvez l'utiliser pour supprimer tous les liens symboliques:

find -type l -delete

avec les versions modernes de find.

Sur les anciennes versions de recherche, il peut être nécessaire:

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

Pour limiter à une certaine cible de lien, en supposant qu'aucun 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

if pourrait bien sûr également inclure une condition plus complexe telle que la correspondance d'un modèle 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
67
0xC0000022L

Avec un find moderne qui prend en charge -lname:

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

devrait le faire.

La solution find est excellente.

Juste au cas où votre recherche ne prend pas en charge -lname, voici une autre façon d'utiliser uniquement Shell et readlink.

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

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 un lien symbolique libre lui-même, il supprimerait tous les fichiers qui, après la résolution du lien symbolique, vivent sous /usr/local/textlive qui inclurait des liens vers /usr/local/texlive/foo mais aussi à ../texlive/bar ou pour /usr/./local/texlive/whatever ou pour /some/other/symlink qui est lui-même un lien symbolique pointant dans /usr/local/texlive, etc.

1
Stéphane Chazelas

Accédez à votre 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
0
wallance