Jak mohu odstranit všechny symbolické odkazy se zvláštním cílem?

Pomocí příkazu:

ls -la * 

Mohu vypsat všechny své symbolické odkazy.

Jak mohu odstranit všechny symbolické odkazy, které jsou propojeny se speciální složkou?

Například:

V mém adresáři usr/local/bin Mám následující položky:

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 

Nyní chci odstranit všechny odkazy s cestou /usr/local/texlive/

Komentáře

  • Máte na mysli odstranění všech symbolických odkazů propojených s cílovou složkou? Nebo přesunout všechny nalezené symbolické odkazy do konkrétní složky?
  • @uther: Mám na mysli odstranění odkazů.

Odpovědět

Přečtěte si alternativní odpověď . Je to ještě více, i když v tomto okamžiku nebylo hlasováno tak vysoko.

Tímto způsobem můžete smazat všechny symbolické odkazy:

find -type l -delete 

s moderními find verzemi.

U starších verzí vyhledávače to může být:

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

Chcete-li se omezit na určitý cíl odkazu, za předpokladu, že žádná z cest neobsahuje žádný znak nového řádku:

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

nebo pěkně naformátovaný

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

if může samozřejmě obsahovat i složitější podmínku, jako je shoda vzoru s grep.


Na míru vašemu případu:

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

nebo pěkně formátovaný:

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

Komentáře

  • Odstraní tento příkaz všechny symbolické odkazy? Viz moje úprava výše ..
  • @ Marco: ano, první tři řádky ano. Další úpravy 🙂
  • Také bych přidal -print na konec

příkaz pro získání vizuální zpětné vazby.

Odpověď

S moderní find, který podporuje -lname:

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

by měl dělat it.

Komentáře

  • To je skvělé a jednoduché řešení. Testoval jsem a funguje to jako kouzlo. Díky
  • Pravděpodobně by to mělo být find /usr/local/bin
  • Ani moderní, nutně. GNU find-lname déle, než jsem ji udržoval (zhruba od roku 2003).
  • @JamesYoungman: Dík! Pod moderním find jsem opravdu myslel GNU find. 😉 Použil jsem usr/local/bin, protože to ' je to, co OP použil.

Odpověď

Řešení find je skvělé.

Jen pro případ, že váš nález nebude podpora -lname, zde je další způsob, který používá pouze shell a readlink.

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

Odpověď

Pomocí zsh:

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

$REPLY:P plně vyřeší cestu k cestě bez symlinků, takže za předpokladu, že /usr/local/texlive je symlink free free , odstranilo by všechny soubory, které po rozlišení symbolických odkazů žijí pod /usr/local/textlive, což by zahrnovalo odkazy na /usr/local/texlive/foo, ale také na ../texlive/bar nebo /usr/./local/texlive/whatever nebo /some/other/symlink což je samotný symbolický odkaz směřující na /usr/local/texlive atd.

Odpověď

Přejít na cestu a nastavit konfiguraci cesty

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

Komentáře

  • Jelikož se jedná o cesty jako usr/local/bin, které grep hledá, grep -E je způsob, jak jít. Jinak by neexistovaly žádné odpovídající výsledky. Také h v ls zde ' neslouží žádnému účelu! -h, --human-readable : with -l, print sizes in human readable format (e.g., 1K 234M 2G). Další informace naleznete v man ls nebo man grep

odpovědi

sudo unlink /path/of/your/package

to je

Komentáře

  • Jak to odstraní všechny symbolické odkazy směřující na cíle pod danou cestou? Všimněte si, že otázka se týká odstranění symbolických odkazů v konkrétním adresáři, který ukazuje na cíle v nějakém jiném adresáři.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *