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 GNUfind
. 😉 Użyłemusr/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óregrep
wyszukuje,grep -E
jest drogą do zrobienia. W przeciwnym razie nie byłoby pasujących wyników. Równieżh
wls
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, zobaczman ls
lubman 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.