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
-printtoevoegen 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
findheeft-lnamelanger dan ik het heb onderhouden (sinds rond 2003). - @JamesYoungman: Bedankt! Met modern
findbedoelde ik echt GNUfind. 😉 Ik hebusr/local/bingebruikt, 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/binwaarnaargrepzoekt,grep -Eis de juiste keuze. Anders zouden er geen overeenkomende resultaten zijn. Ookhinlsheeft ' hier geen enkel doel!-h, --human-readable : with -l, print sizes in human readable format (e.g., 1K 234M 2G). Zie voor meerman lsofman 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.