Hoe kan ik alle symbolische links met een speciaal doel verwijderen?

Met het commando:

ls -la * 

kan ik al mijn symbolische links opsommen.

Hoe kan ik alle symbolische links verwijderen die zijn gekoppeld aan een speciale map?

Bijvoorbeeld:

In mijn directory usr/local/bin Ik heb de volgende vermeldingen:

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 

Nu wil ik alle links met het pad /usr/local/texlive/

Reacties

  • Bedoelt u dat u alle symbolische links verwijdert die aan een doelmap zijn gekoppeld? Of alle gevonden symlinks naar een specifieke map verplaatsen?
  • @uther: ik bedoel het verwijderen van de links.

Antwoord

Lees het alternatieve antwoord . Het is zelfs nog relevanter, hoewel er op dit moment niet zo hoog wordt gestemd.

U kunt dit gebruiken om alle symbolische links te verwijderen:

find -type l -delete 

met moderne find versies.

Bij oudere zoekversies moet het mogelijk zijn:

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

Om te beperken tot een bepaald linkdoel, ervan uitgaande dat geen van de paden een nieuw-regel-teken bevat:

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

of netjes opgemaakt

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

De if kan natuurlijk ook een complexere voorwaarde bevatten, zoals het matchen van een patroon met grep.


Op maat gemaakt voor uw geval:

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

of mooi opgemaakt:

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

Reacties

  • Verwijdert dit commando alle symlinks? Zie mijn bewerking hierboven ..
  • @ Marco: ja, de eerste drie regels zouden. Meer bewerken 🙂
  • Ik zou ook een -print toevoegen aan het einde van de

commando om wat visuele feedback te krijgen.

Antwoord

Met een moderne find die -lname ondersteunt:

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

zou moeten doen het.

Opmerkingen

  • Dat is een geweldige en eenvoudige oplossing. Ik heb het getest en het werkt als een zonnetje. Bedankt
  • Vermoedelijk zou dat find /usr/local/bin
  • Niet per se modern moeten zijn. GNU find heeft -lname langer dan ik het heb onderhouden (sinds rond 2003).
  • @JamesYoungman: Bedankt! Met modern find bedoelde ik echt GNU find. 😉 Ik heb usr/local/bin gebruikt, omdat ' is wat het OP gebruikte.

Answer

De find oplossing is geweldig.

Voor het geval je vondst dat niet doet ondersteuning -lname, hier “is een andere manier die alleen shell en readlink gebruikt.

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

Antwoord

Met zsh:

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

$REPLY:P lost het pad volledig op naar een symlink-vrij pad, dus ervan uitgaande dat /usr/local/texlive zelf symlink-vrij is , het zou alle bestanden verwijderen die na de resolutie van de symlink onder /usr/local/textlive staan, die links bevatten naar /usr/local/texlive/foo maar ook naar ../texlive/bar of naar /usr/./local/texlive/whatever of naar /some/other/symlink wat zelf een symlink is die verwijst naar /usr/local/texlive, etc.

Antwoord

Ga naar je pad en stel je padconfiguratie in

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

Reacties

  • Aangezien dit paden zijn zoals usr/local/bin waarnaar grep zoekt, grep -E is de juiste keuze. Anders zouden er geen overeenkomende resultaten zijn. Ook h in ls heeft ' hier geen enkel doel! -h, --human-readable : with -l, print sizes in human readable format (e.g., 1K 234M 2G). Zie voor meer man ls of man grep

Answer

sudo unlink /path/of/your/package

dat is het

Reacties

  • Hoe worden alle symbolische links verwijderd die naar doelen onder het opgegeven pad verwijzen? Merk op dat de vraag stelt over het verwijderen van de symbolische links in een bepaalde directory die verwijzen naar doelen in een andere directory.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *