tote Symlinks finden

Software besorgen und anwenden
Post Reply
Message
Author
Raphael

tote Symlinks finden

#1 Post by Raphael »

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...

User avatar
Lateralus
prolinux-forum-admin
Posts: 1238
Joined: 05. May 2004 7:35

#2 Post by Lateralus »

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

Code: Select all

#!/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

User avatar
killerhippy
Posts: 529
Joined: 19. May 2000 19:36
Contact:

#3 Post by killerhippy »

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: Select all

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: Select all

 | 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: Select all

 > 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: Select all

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: Select all

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 Post by Raphael »

Funktioniert.
Vielen Dank :-)

Post Reply