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 GNUfind
. 😉 Ik hebusr/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
waarnaargrep
zoekt,grep -E
is de juiste keuze. Anders zouden er geen overeenkomende resultaten zijn. Ookh
inls
heeft ' hier geen enkel doel!-h, --human-readable : with -l, print sizes in human readable format (e.g., 1K 234M 2G)
. Zie voor meerman ls
ofman 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.