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

43

Mit dem Befehl:

ls -la *

Ich kann alle meine symbolischen Links auflisten.

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

Zum Beispiel:

In meinem Verzeichnis habe usr/local/binich folgende 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 entfernen /usr/local/texlive/

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

Antworten:

63

Bitte lesen Sie unbedingt die alternative Antwort . Es geht sogar noch mehr um den Punkt, obwohl zu diesem Zeitpunkt noch nicht so hoch gestimmt wurde.

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

find -type l -delete

mit modernen findVersionen.

In älteren Versionen muss es möglicherweise sein:

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

So beschränken Sie sich auf ein bestimmtes Linkziel, vorausgesetzt, keiner der Pfade enthält ein Zeilenumbruchzeichen:

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

oder schön formatiert

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

Das ifkönnte natürlich auch eine komplexere Bedingung wie das Anpassen eines Musters mit einschließen 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 schön formatiert:

find -type l | while IFS= read -r lnk
do
  if readlink "$lnk" | grep -q '^/usr/local/texlive/'
  then
    rm "$lnk"
  fi
done
0xC0000022L
quelle
Entfernt dieser Befehl alle Symlinks? Bitte sehen Sie meine Bearbeitung oben ..
Marco Daniel
@Marco: ja, die ersten drei Zeilen würden. Bearbeiten von mehr :)
0xC0000022L
Ich würde auch ein -printam Ende des findBefehls hinzufügen , um ein visuelles Feedback zu erhalten.
Runlevel0
30

Mit einem modernen find, der unterstützt -lname:

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

Sollte es tun.

Christoffer Hammarström
quelle
1
Das ist eine großartige und einfache Lösung. Ich habe getestet und es funktioniert wie ein Zauber. Vielen Dank
Marco Daniel
Vermutlich sollte das seinfind /usr/local/bin
James Youngman
1
Nicht einmal modern, unbedingt. GNU findgibt es schon -lnamelänger als ich es gewartet habe (seit ungefähr 2003).
James Youngman
@ JamesYoungman: Danke! Mit modern findmeine ich wirklich GNU find. ;) Ich habe es benutzt usr/local/bin, weil es das ist, was das OP benutzt hat.
Christoffer Hammarström
5

Die findLösung ist großartig.

Nur für den Fall, dass Ihre Suche dies nicht unterstützt -lname, finden Sie hier eine andere Methode, bei der nur shell und verwendet werden readlink.

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

Mit zsh:

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

$REPLY:PLöst den Pfad zu einem symlinkfreien Pfad vollständig auf, so dass unter der Annahme, dass er /usr/local/texliveselbst symlinkfrei ist, alle Dateien entfernt werden, unter denen nach der symlink-Auflösung /usr/local/textliveLinks zu, /usr/local/texlive/fooaber auch zu ../texlive/baroder zu /usr/./local/texlive/whateveroder auf /some/other/symlinkdie selbst ein symlink verweist /usr/local/texlive, usw .

Stéphane Chazelas
quelle
0

Gehen Sie zu path your und legen Sie Ihre Pfadkonfiguration fest

ls -alh|grep "your-pattern-to-file-or-folder-for-symlink"| awk '{print $9}'|xargs rm -rf
wallance
quelle
Da dies Pfade sind, nach usr/local/bindenen grepgesucht wird, grep -Eist der Weg zu gehen. Sonst gäbe es keine passenden Ergebnisse. Auch hin lsdient hier keinem Zweck! -h, --human-readable : with -l, print sizes in human readable format (e.g., 1K 234M 2G). Weitere man lsman grep
Informationen finden