[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/