tote Symlinks finden

Software besorgen und anwenden
Antworten
Nachricht
Autor
Raphael

tote Symlinks finden

#1 Beitrag von Raphael » 16. Apr 2006 8:05

Hallo und frohe Ostern.
Kurze Frage, wie spüre ich verwaiste Symlinks im System auf ? (Debian "Etch")
Gibt es hierzu ein Tool oder eine Software die man gezielt einsetzen könnte ?
Von Hand aufspüren ist doch etwas umständlich...

Benutzeravatar
Lateralus
prolinux-forum-admin
Beiträge: 1238
Registriert: 05. Mai 2004 7:35

#2 Beitrag von Lateralus » 16. Apr 2006 11:50

Hiermit müsste es gehen - ich übernehme aber keine Verantwortung.

Code: Alles auswählen

#!/bin/bash

IFS="
"

for link in $(find / -type l); do
        if test ! -z "$(file $link | grep broken)"; then
                echo Broken Link: $link
                # rm $link # Diese Zeile aktivieren, um die Links zu löschen.
        fi
done

Benutzeravatar
killerhippy
Beiträge: 529
Registriert: 19. Mai 2000 19:36
Kontaktdaten:

#3 Beitrag von killerhippy » 17. Apr 2006 19:12

Das geht auch mit nem Einzeiler, man beachte, dass hier /proc ausgeklammert wird, was notwendig ist, da man in diesem Kernelsteuerungs-Pseudodateisystem nicht einfach Dateien löschen möchte und selbst wenn man die Dateien nur angezeigt bekommen möchte, sind die Angaben aus /proc überflüssig und stören nur!!!

Code: Alles auswählen

find / -wholename '/proc' -prune -o -type l -print0 | xargs -0 file - | grep broken | cut -d ":" -f 1
Diese Zeile gibt die Treffer zeilenweise aus, vorrausgesetzt, man hat keine Links mit ":" als Dateinamenbestandteil.

Das kann man dann durch Anhängen von

Code: Alles auswählen

 | xargs rm 
auch zum Löschen verwenden, aber das ist äusserst gefährlich und sollte man nicht tun.

Besser ist es, die Ausgabe in eine Datei umzulenken:

Code: Alles auswählen

 > tote_links.datei
Diese überprüfen und ggfs korrigieren. Fussfalle sind auch hier wieder Dateien mit Leerzeichen im Namen. Wenn man keine solche Dateinamen in der Trefferliste hat, kann man die Datei verwenden um zu löschen:

Code: Alles auswählen

for i in `cat tote_links.datei`; do rm "${i}"; done
Sind doch Dateinamen mit Leerzeichen dabei, muss der Internal Field Separator angepasst werden:

Code: Alles auswählen

IF_SIK=$IFS; IFS=""; for i in `cat tote_links.datei`; do rm "${i}"; done; IFS=$IF_SIK
Es gibt keine dumme Fragen!

Killerhippy

Raphael

#4 Beitrag von Raphael » 19. Apr 2006 9:52

Funktioniert.
Vielen Dank :-)

Antworten