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
má-lname
déle, než jsem ji udržoval (zhruba od roku 2003). - @JamesYoungman: Dík! Pod moderním
find
jsem opravdu myslel GNUfind
. 😉 Použil jsemusr/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
vls
zde ' neslouží žádnému účelu!-h, --human-readable : with -l, print sizes in human readable format (e.g., 1K 234M 2G)
. Další informace naleznete vman ls
neboman 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.