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

43

Avec la commande:

ls -la *

Je peux lister tous mes liens symboliques.

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

Par exemple:

Dans mon répertoire, usr/local/binj'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/

Marco Daniel
la source
1
Voulez-vous dire supprimer tous les liens symboliques liés à un dossier cible? Ou déplacez tous les liens symboliques trouvés dans un dossier spécifique?
George M
@uther: je veux dire supprimer les liens.
Marco Daniel

Réponses:

63

Assurez-vous de lire la réponse alternative . C'est encore plus pertinent, même s'il n'est pas voté aussi haut.

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

find -type l -delete

avec les findversions modernes .

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

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 contienne 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

Cela ifpourrait bien sûr aussi inclure une condition plus complexe telle que l’appariement d’un motif 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
0xC0000022L
la source
Cette commande supprime-t-elle tous les liens symboliques? S'il vous plaît voir mon édition ci-dessus ..
Marco Daniel
@Marco: oui, les trois premières lignes le seraient. Édition de plus :)
0xC0000022L
Je voudrais aussi ajouter un -printà la fin de la findcommande pour obtenir un retour visuel.
runlevel0
30

Avec un moderne findqui supporte -lname:

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

devrait le faire.

Christoffer Hammarström
la source
1
C'est une solution simple et géniale. J'ai testé et cela fonctionne comme un charme. Merci
Marco Daniel
Je suppose que cela devrait êtrefind /usr/local/bin
James Youngman
1
Pas même moderne, forcément. GNU finda eu -lnamependant plus longtemps que je l'ai maintenu (depuis environ 2003).
James Youngman
@JamesYoungman: Merci! Par moderne, findje voulais vraiment dire GNU find. ;) J'ai utilisé usr/local/bin, parce que c'est ce que l'OP a utilisé.
Christoffer Hammarström
5

La findsolution est géniale.

Juste au cas où votre recherche ne prend pas en charge -lname, voici une autre méthode qui utilise uniquement shell et readlink.

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

Avec zsh:

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

$REPLY:Présout complètement le chemin vers un chemin sans lien symbolique, donc en supposant que ce /usr/local/texlivesoit un lien symbolique libre, il supprimera tous les fichiers qui, après la résolution du lien symbolique /usr/local/textlive, contiennent des liens vers /usr/local/texlive/foomais également vers ../texlive/barou vers /usr/./local/texlive/whateverou /some/other/symlinkqui est lui-même un lien symbolique pointant vers /usr/local/texlive, etc. .

Stéphane Chazelas
la source
0

Allez au chemin votre et définissez vous-même la configuration du chemin

ls -alh|grep "your-pattern-to-file-or-folder-for-symlink"| awk '{print $9}'|xargs rm -rf
wallance
la source
Comme ce sont des chemins comme usr/local/bincelui grep-ci, grep -Ec'est le chemin à parcourir. Sinon, il n'y aurait aucun résultat correspondant. Aussi hdans lsne sert à rien ici! -h, --human-readable : with -l, print sizes in human readable format (e.g., 1K 234M 2G). Pour plus d'informations man lsou voirman grep
ss_iwe