[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Hardlinks verwenden
[Thread Prev] | [Thread Next]
- Subject: Re: Hardlinks verwenden
- From: Werner Holtfreter <Holtfreter@xxxxxx>
- Date: Sun, 16 Aug 2009 00:17:13 +0200
- To: uugrn@xxxxxxxxxxxxxxx
Am Samstag, 2009-08-15 00:06:04 schrieb Raphael Becker:
> On Fri, Aug 14, 2009 at 02:39:23PM +0200, Werner Holtfreter wrote:
> > > Wie kann man nachtraeglich feststellen, wo bzw. in welchen
> > > Verzeichnissen die zusammengehoerigen Hardlinks stecken?
> >
> > Fuer dieses Problem wurde hier und in de.comp.os.unix.shell
> > eine gute Loesung gefunden:
> >
> > find . -maxdepth 1 -xdev ! -type d -links +1 -exec sh -c 'echo;ls -l -- "$1";find ~/ -xdev -samefile "$1"' sh {} \;;echo
>
> Diese Loesung finde ich sehr strange (auch wenn sie funktionieren
> mag).
Sie funktioniert und hat eine uebersichtliche Ausgabe. Die Suche nach
einer anderen, laengeren Loesung hat folglich wohl eher sportlichen
denn praktischen Wert.
Ich hatte erst eine noch kuerzere Form vorgeschlagen...
find . -maxdepth 1 -xdev ! -type d -links +1 -printf 'echo;ls -l %p;find ~/ -xdev -inum %i\n'|sh;echo
...die in de.comp.os.unix.shell aber wegen Sicherheitsmaengeln bei
speziellen Dateinamen verworfen wurde und zu obigem Konstrukt
fuehrte. (Siehe ab <h5o4gu$24m$1@xxxxxxxxxxxxxxxxx>)
Deine Loesung scheint ein vergleichbares Sicherheitsproblem aber
nicht zu haben, da die Dateinamen nicht an eine Shell-Zeile gehen.
> Ich haette folgende Idee anzubieten:
>
> gfind . -links +1 -type f -printf "%i|%p\n" > hardlinks.out
>
> Das erzeugt hier zB folgenden Output:
>
> 12765612|./A
> 12765612|./B
> 12765612|./C
> 12765599|./a
> 12765599|./b
>
> (d.h. nur alle Inodes vom Typ "Datei", die mehr als einen Link
> haben)
>
> Wenn Du nun wissen willst, welches die anderen Hardlinks von ./C
> sind, dann fragst Du das so ab:
>
> ---[suche.sh] ------------------------------------------
> #! /bin/sh
> if [ $# -ge 1 ]; then
> while [ -n "$1" ]; do
> SUCHE="$1"
> INODES="$(grep -F "|${SUCHE}" hardlinks.out | grep -o "[^|]*")"
> for I in $INODES; do
> echo "Hardlinks auf $SUCHE (${I}):"
> < hardlinks.out grep "^${I}|" | cut -f 2- -d "|"
> done
> shift
> done
> else
> echo "$0 Datei(pattern)"
> fi
> ---------------------------------------------
>
> $ ./suche.sh ./C
> Hardlinks auf ./C (12765612):
> ./A
> ./B
> ./C
>
> Man koennte das auch mit Arrays in awk loesen. Das muesste ich aber
> erst ausknobeln.
Da aber alle Experten von Hardlinks abraten und ich die Warnungen
schon beim Backup bestaetigt sehe, haben sich Hardlinks
wahrscheinlich doch erledigt.
Es muesste etwas geben, was sich verhaelt wie Hardlinks: Eine
Verlinkung, die in beide bzw. in alle Richtungen geht und die
gegenueber Hardlinks noch den Vorteil haette, dass man auf die
verbundenen Links kommt, ohne das Dateisystem zu durchsuchen.
Ich nenne diese Wunschgebilde mal "Netzlink". Wenn ich einen
Netzlink zu einer Datei anlege, dann wird diese Datei selbst
zum Netzlink und verweist auch zurueck. Es koennen weitere Links
einbezogen werden, daher "Netz". Eigentlich genau wie Hardlinks,
nur das man sie als Ganzes in andere Dateisysteme kopieren kann,
ohne dass die Beziehungen zerstoert werden.
--
Viele Gruesse
Werner Holtfreter
--
http://mailman.uugrn.org/mailman/listinfo/uugrn
Wiki: http://wiki.uugrn.org/wiki/UUGRN:Mailingliste
Archiv: http://lists.uugrn.org/