Wie kann ich alle symbolischen Links mit einem bestimmten Ziel entfernen?

Mit dem Befehl:

ls -la * 

kann ich alle meine symbolischen Links auflisten.

Wie kann ich alle symbolischen Links entfernen, die mit einem speziellen Ordner verknüpft sind?

Zum Beispiel:

In meinem Verzeichnis usr/local/bin Ich habe die folgenden Einträge:

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 

Jetzt möchte ich alle Links mit dem Pfad /usr/local/texlive/

Kommentare

  • Meinen Sie damit, alle mit einem Zielordner verknüpften Symlinks zu entfernen? Oder alle gefundenen Symlinks in einen bestimmten Ordner verschieben?
  • @uther: Ich meine, die Links entfernen.

Antwort

Bitte lesen Sie die alternative Antwort . Es ist noch wichtiger, obwohl es zu diesem Zeitpunkt noch nicht als hoch eingestuft wurde.

Hiermit können Sie alle symbolischen Links löschen:

find -type l -delete 

mit modernen find -Versionen.

Bei älteren Suchversionen muss es möglicherweise sein:

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

Um auf ein bestimmtes Link-Ziel zu beschränken, wird davon ausgegangen, dass keiner der Pfade ein Zeilenumbruchzeichen enthält:

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

oder gut formatiert

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

Die if könnte natürlich auch eine komplexere Bedingung enthalten, z. B. das Abgleichen eines Musters mit grep.


Auf Ihren Fall zugeschnitten:

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

oder gut formatiert:

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

Kommentare

  • Entfernt dieser Befehl alle Symlinks? Siehe meine Bearbeitung oben ..
  • @ Marco: Ja, die ersten drei Zeilen würden. Mehr bearbeiten 🙂
  • Ich würde auch eine -print am Ende des

Befehl, um visuelles Feedback zu erhalten.

Antwort

Mit Ein modernes find, das -lname unterstützt:

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

sollte dies tun it.

Kommentare

  • Das ist eine großartige und einfache Lösung. Ich habe getestet und es funktioniert wie ein Zauber. Danke
  • Vermutlich sollte das find /usr/local/bin
  • sein. Nicht einmal modern, unbedingt. GNU find hatte -lname länger als ich es gepflegt habe (seit ungefähr 2003).
  • @JamesYoungman: Vielen Dank! Mit modernem find meinte ich wirklich GNU find. 😉 Ich habe usr/local/bin verwendet, weil das ' das ist, was das OP verwendet hat.

Antwort

Die find -Lösung ist großartig.

Nur für den Fall, dass Ihr Fund nicht funktioniert Unterstützung -lname, hier ist eine andere Möglichkeit, die nur Shell und readlink verwendet.

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

Antwort

Mit zsh:

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

$REPLY:P löst den Pfad vollständig zu einem symlinkfreien Pfad auf, sodass /usr/local/texlive selbst symlinkfrei ist Es würde alle Dateien entfernen, die nach der Symlink-Auflösung unter /usr/local/textlive leben und Links zu /usr/local/texlive/foo, aber auch zu oder zu /usr/./local/texlive/whatever oder zu /some/other/symlink, das selbst ein Symlink ist, der auf /usr/local/texlive usw.

Antwort

Gehen Sie zu Ihrem Pfad und legen Sie die Pfadkonfiguration fest.

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

Kommentare

  • Da dies Pfade wie usr/local/bin sind, nach denen grep sucht, grep -E ist der richtige Weg. Andernfalls würde es keine übereinstimmenden Ergebnisse geben. Auch h in ls erfüllt hier ' keinen Zweck! -h, --human-readable : with -l, print sizes in human readable format (e.g., 1K 234M 2G). Weitere Informationen finden Sie unter man ls oder man grep

Antwort

sudo unlink /path/of/your/package

das ist es

Kommentare

  • Wie werden alle symbolischen Links entfernt, die auf Ziele unterhalb des angegebenen Pfads verweisen? Beachten Sie, dass in der Frage gefragt wird, ob die symbolischen Links in einem bestimmten Verzeichnis entfernt werden sollen, die auf Ziele in einem anderen Verzeichnis verweisen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.