rm following symlink

007sascha

New Member
Hallo,
ich stehe gerade echt auf dem Schlauch.
Wie kann ich über einen Symlink eine verlinkte Datei einfach löschen?
rm löscht ja normalerweise nur den Link.
Beispiel Verzeichnis
Code:
-rw-r--r-- 1 root root 2 Jun  8 18:01 1.txt
-rw-r--r-- 1 root root 2 Jun  8 18:01 2.txt
-rw-r--r-- 1 root root 2 Jun  8 18:01 3.txt
lrwxrwxrwx 1 root root 5 Jun  8 18:10 link1.txt -> 1.txt
Nun will ich über den Link link1.txt die Orginaldatei 1.txt löschen, geht das überhaupt?
Gruß Sascha
 
Nur bei dieser einen Datei?

Oder willst du Symlinks nach bestimmten Dateinamen suchen und dann deren Zieldateien löschen?
 
Mir reicht die eine Datei, bzw. der Dateiname des Links ist bekannnt nur der Verweis auf die Orginaldatei ändert sich. Wenn ich einen Ansatz habe kann ich mir den Rest bestimmt selbst erarbeiten ;)
Im Prinzip geht es darum über Links ein Rollieren von Dateien zu ermöglichen.

Also:
1.txt
2.txt
3.txt
4.txt

Zuerst :
alt.txt -> 1.txt
aktuell.txt -> 2.txt

Dann:
rm alt.txt (bzw die Datei 1.txt)
mv aktuell.txt alt.txt
aktuell.txt -> 3.txt
 
Also diese Aufgabe ist zerbricht einem echt den Kopf. Unter anderem muss man auch überprüfen ob es ein relativer oder absoluter Pfad ist. Wenn man die Links list, dann nochmal das gleiche Spiel. Ich dachte eigentlich erst an find (follow symlinks, Option -L). Damit bin ich aber auch nicht weit gekommen. Also hab ich mal ein bisschen in Python programmiert:

Code:
#!/usr/bin/env python

import os
import sys


def help():
    print sys.argv[0], 'path'


def retpath(root, path):
    if os.path.islink(os.path.join(root, path)):
        _link_to = os.readlink(os.path.join(root, path))
        if os.path.isabs(_link_to):
            return _link_to.rstrip(os.path.sep)
        else:
            return os.path.abspath(os.path.join(root, _link_to)).rstrip(os.path.sep)
    else:
        return None

def search(path):
    for root, dirs, files in os.walk(path):
        if not os.path.isabs(root):
            #root = os.path.abspath(searchpath, root)
            pass
        for file in files:
            _link_to = retpath(root, file)
            if _link_to:
                print _link_to
        for dir in dirs:
            _link_to = retpath(root, dir)
            if _link_to:
                print _link_to


if __name__ == '__main__':
    if len(sys.argv) < 2:
        help()
    else:
        search(os.path.abspath(sys.argv[1]))

Auf Richtigkeit hab ich den Code jetzt nicht komplett geprüft. Es werden alle Ziele in der Konsole ausgegeben. Alternativ könnte man noch den Pfad der Symlinks ausgeben. Die Ausgabe solle immer als absoluter Pfad ausgegeben werden.

Das als Shell-Script zu schreiben habe ich mir mal erspart. Es wäre etwas hässlicher...

PS: Solche Spielereien wie PIPE wären auch möglich. Letztendlich würde das Programm dann recht klein werden.

EDIT:
Code:
rm $(readlink link1.txt)
Ja, das ist kürzer :-D

Könnte man auf prima mit find kombinieren.
 
Last edited by a moderator:
Habe was einfaches gebastelt:
Code:
ls -l | grep alt |awk -F '-> ' '{print $2}' |xargs rm && rm alt
Trotzdem Danke.
 
Back
Top