Jak mogę usunąć wszystkie dowiązania symboliczne ze specjalnym celem?

Poleceniem:

ls -la * 

Mogę wyświetlić wszystkie moje dowiązania symboliczne.

Jak mogę usunąć wszystkie dowiązania symboliczne, które są połączone ze specjalnym folderem?

Na przykład:

W moim katalogu usr/local/bin Mam następujące wpisy:

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 

Teraz chcę usunąć wszystkie linki ze ścieżką /usr/local/texlive/

Komentarze

  • Czy masz na myśli usunięcie wszystkich linków symbolicznych połączonych z folderem docelowym? Lub przenieść wszystkie znalezione linki symboliczne do określonego folderu?
  • @uther: mam na myśli usunięcie linków.

Odpowiedź

Przeczytaj alternatywną odpowiedź . To jest jeszcze bardziej istotne, chociaż w tym momencie nie głosowano tak wysoko.

Możesz użyć tego do usunięcia wszystkich dowiązań symbolicznych:

find -type l -delete 

z nowoczesnymi wersjami find.

W starszych wersjach Find może to być:

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

Aby ograniczyć do określonego celu linku, zakładając, że żadna ze ścieżek nie zawiera żadnego znaku nowej linii:

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

lub ładnie sformatowany

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

if może oczywiście zawierać bardziej złożony warunek, taki jak dopasowanie wzorca do grep.


Dopasowane do Twojego przypadku:

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

lub ładnie sformatowane:

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

Komentarze

  • Czy to polecenie usuwa wszystkie dowiązania symboliczne? Zobacz moją edycję powyżej.
  • @ Marco: tak, pierwsze trzy wiersze będą. Więcej edycji 🙂
  • Dodałbym również -print na końcu

, aby uzyskać wizualną informację zwrotną.

Odpowiedz

Z nowoczesny find obsługujący -lname:

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

powinien wystarczyć to.

Komentarze

  • To świetne i proste rozwiązanie. Testowałem i działa jak urok. Dzięki
  • Prawdopodobnie powinno to być find /usr/local/bin
  • Niekoniecznie nawet nowoczesne. GNU find ma -lname dłużej niż go utrzymywałem (od około 2003 roku).
  • @JamesYoungman: Dzięki! Przez współczesne find naprawdę miałem na myśli GNU find. 😉 Użyłem usr/local/bin, ponieważ ' jest tym, czego używał OP.

Odpowiedź

Rozwiązanie find jest świetne.

Na wypadek, gdyby twoje znalezisko nie działało obsługuje -lname, tutaj jest inny sposób, który wykorzystuje tylko powłokę i readlink.

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

Odpowiedź

Z zsh:

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

$REPLY:P w pełni rozwiązuje ścieżkę do ścieżki pozbawionej dowiązań symbolicznych, więc zakładając, że /usr/local/texlive jest samo w sobie wolne , spowoduje usunięcie wszystkich plików, które po rozwiązaniu dowiązań symbolicznych znajdują się pod /usr/local/textlive, co zawierałoby linki do /usr/local/texlive/foo, ale także do ../texlive/bar lub /usr/./local/texlive/whatever lub /some/other/symlink, które samo w sobie jest dowiązaniem symbolicznym wskazującym na /usr/local/texlive itp.

Odpowiedź

Przejdź do ścieżki i ustaw własną konfigurację ścieżki

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

Komentarze

  • Ponieważ są to ścieżki takie jak usr/local/bin, które grep wyszukuje, grep -E jest drogą do zrobienia. W przeciwnym razie nie byłoby pasujących wyników. Również h w ls nie ' nie służy tutaj żadnemu celowi! -h, --human-readable : with -l, print sizes in human readable format (e.g., 1K 234M 2G). Aby uzyskać więcej informacji, zobacz man ls lub man grep

Odpowiedź

sudo unlink /path/of/your/package

to wszystko

Komentarze

  • W jaki sposób to usuwa wszystkie dowiązania symboliczne prowadzące do celów pod daną ścieżką? Zauważ, że pytanie dotyczy usunięcia dowiązań symbolicznych w określonym katalogu, które wskazują cele w innym katalogu.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *