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

43

Za pomocą polecenia:

ls -la *

Mogę wymienić 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/binmam 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/

Marco Daniel
źródło
1
Czy masz na myśli usunięcie wszystkich dowiązań symbolicznych powiązanych z folderem docelowym? Lub przenieść wszystkie znalezione dowiązania symboliczne do określonego folderu?
George M,
@uther: Mam na myśli usunięcie linków.
Marco Daniel

Odpowiedzi:

63

Proszę przeczytać alternatywną odpowiedź . Jest to 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 findwersjami.

W starszych wersjach find może to być:

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

Aby ograniczyć się do określonego celu linku, zakładając, że żadna ścieżka nie zawiera 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 sformatowane

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

ifMoże oczywiście zawierać również bardziej złożone warunki takie jak dopasowanie wzorca z grep.


Dostosowane 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 sformatowany:

find -type l | while IFS= read -r lnk
do
  if readlink "$lnk" | grep -q '^/usr/local/texlive/'
  then
    rm "$lnk"
  fi
done
0xC0000022L
źródło
Czy to polecenie usuwa wszystkie dowiązania symboliczne? Proszę zobaczyć moją edycję powyżej ..
Marco Daniel
@Marco: tak, pierwsze trzy wiersze by. Edycja więcej :)
0xC0000022L
Dodałbym również -printna końcu findpolecenia, aby uzyskać wizualną informację zwrotną.
runlevel0
30

Dzięki nowoczesnemu, findktóry obsługuje -lname:

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

powinien to zrobić.

Christoffer Hammarström
źródło
1
To świetne i proste rozwiązanie. Przetestowałem i działa jak urok. Dzięki
Marco Daniel
Prawdopodobnie tak powinno byćfind /usr/local/bin
James Youngman
1
Niekoniecznie nawet nowoczesny. GNU findma go -lnamedłużej niż ja go utrzymywałem (od około 2003 roku).
James Youngman
@JamesYoungman: Dzięki! Przez nowoczesność findnaprawdę miałem na myśli GNU find. ;) Użyłem usr/local/bin, ponieważ tego właśnie użył OP.
Christoffer Hammarström
5

findRozwiązanie jest wielki.

Na wypadek, gdyby twoje wyszukiwanie nie wspierało -lname, oto inny sposób, w którym używa się tylko powłoki i readlink.

cd /usr/local/bin
for f in *; do
  case "$(readlink "$f")" in /usr/local/texlive/*)
    rm "$f"
    ;;
  esac
done
Mikel
źródło
1

Z zsh:

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

$REPLY:Pw pełni rozwiązuje ścieżkę do wolnej od dowiązań symbolicznych, więc zakładając /usr/local/texlive, że sama nie jest dowiązań symbolicznych, usunie wszystkie pliki, które po rozstrzygnięciu dowiązań symbolicznych żyją, pod /usr/local/textlivektórymi będą zawierać linki do, /usr/local/texlive/fooale także do ../texlive/barlub do /usr/./local/texlive/whateverlub do /some/other/symlinkktórych sam jest dowiązaniem symbolicznym /usr/local/texliveitp. .

Stéphane Chazelas
źródło
0

Przejdź do ścieżki i ustaw konfigurację ścieżki

ls -alh|grep "your-pattern-to-file-or-folder-for-symlink"| awk '{print $9}'|xargs rm -rf
wallance
źródło
Ponieważ są to ścieżki, usr/local/binktórych grepszuka, grep -Ejest to droga. W przeciwnym razie nie byłoby pasujących wyników. Również hw lsnie służy żadnemu celowi tutaj! -h, --human-readable : with -l, print sizes in human readable format (e.g., 1K 234M 2G). Aby uzyskać więcej informacji, man lslubman grep
ss_iwe