[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Hardlinks verwenden


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/