Soho, neuer Post, sorry. Damit ihr noch mitbekommt, dass sich hier noch was tut. 😉
Nun hat das Gebastel zugeschlagen! 😈
Der eben schnell gebaute Einzeiler
sudo find hauptordner -mindepth 1 -maxdepth 1 -type d -ls 2>/dev/null | cut -d" " -f5 | grep -vw ^1$ | wc -l
Edit: Dieser find-Befehl war auch schon teils falsch...hat Mist gezählt...wegen -ls (= ls -dils).
zeigt bei meinen ersten Versuchen die Anzahl der Hardlinks aller Unterordner im hauptordner an. Einfach mal schrittweise ausprobieren, von links nach rechts immer ein "| blabla" mehr dranhängen. 😉
Einen Haken hat die Befehlszeile noch: Hardlinks mit "11" (oder gar 111) Hardlinks Gesamtanzahl werden so noch nicht erfasst, weil mein regulärer Ausdruck ^1$ auch 11 zulässt. Hat dazu jemand eine Idee? ☺ Edit:Hab nun gegoogelt und mit "-vw 1" funktioniert ganz einfach, was ich will. Zur Sicherheit gegen vorherige Fehler lasse ich aber "-vw ^1$" stehen, das schließt theoetisch einige Fehlerquellen aus. Habe beides gestestet.
Oder wie zählt ihr Hardlinks? Hab noch nicht gegoogelt. 😉 Die Manpages (en) kennen jedenfalls keine Hardlink(s), bei find, du und ls. Habe nun doch schon mal gegoogelt: http://www.unixboard.de/vb3/showthread.php?25798-hardlinks-finden
Interessant! Die Lösung mit find -inum ist dort jedoch nur ein Ansatz, nicht vollständig und ebenfalls umständlich (je nach Sichtweise). Dafür war dort ein Verweis auf -samefile name. Das funktioniert auch:
sudo find -samefile ordner/dateiname
zeigt alle Dateinamen/ Hardlinks an, die zusammengehören (die dieselbe Inode haben). Eine Schleife für ALLE Dateien ähnlich dem obigen Befehl könnte dann alle auflisten. Aber ich will ja nicht die 100.000 Namen wissen, sondern nur die Anzahl - und zwar je Ordner! Um herauszufinden, ob das ein Ordner mit vielen Hardlinks ist (die Anzahl der Dateiobjekte zeigt ja ls -hal schon an, wenn man mal vergleichen möchte, wie hoch der anteilige Anteil an Hardlinks ist). Dazu muss ich aber den obigen Befehl dann doch auf jeden einzelnen Ordner loszählen lassen (das kommt davon, wenn man nur einen Testordner hat):
sudo find hauptordner -mindepth 1 -maxdepth 1 -type d -ls 2>/dev/null | cut -d" " -f5 | grep -vw ^1$ | wc -l
Wenn der Sicherungsordner weitere Unterordner hat (was bei Nicht-Archiven der Fall ist), muss ich weiterbasteln: *hab grad auch festgestellt, dass ls --help teils informativer als die Manpages dazu ist! Hilft aber hier alles nicht weiter ich schweife nur ab und überhaupt halte ich mich zu lange hier auf und mit Linux. 😉 Um das nun mal zu einer Lösung zu bringen: Bitte ausführen:
# dasselbe wie unten, nur umgedrehte Anzeige
# (Ordner oben, Anzahl unten = lesbarer)
sudo -i && for alles in backuphauptordner/*/; do ls -Ad "$alles"; ls -AlR "$alles" | grep ^- | cut -d" " -f2 | grep -vw ^1$ | wc -l; done
Ist im Prinzip wie find -exec, nur mit der Schleife drumrum statt -exec und mit backuphauptordner/*/ statt min/maxdepth und type d sowie Rekursion -R bei ls anstatt die normale Rekursion von find. Syntax ist hier vielleicht bisschen einfacher als das Gewurbel mit min/max und exec-Syntax-Fallen.
Weitere Versuche waren z.B.:
# zählt aber alle Unterverzeichnisse auf einmal zusammen statt wie gewollt getrennt, wirft aber wenigstens Verzeichnisse aus der Hardlinkzählung raus (nur Dateien per grep ^-)
sudo find backuphauptordner -mindepth 1 -maxdepth 1 -type d 2>/dev/null -exec ls -Al "{}" ";" | grep ^- | cut -d" " -f2 | grep -vw ^1$ | wc -l
# umgebaut für eine Verwendung ohne find (x-ter Versuch!):
for alles in backuphauptordner/*; do ls -AlR "$alles" | grep ^- | cut -d" " -f2 | grep -vw ^1$ | wc -l; ls -Ad "$alles" | grep ^d; done
# Falle: ls -hald lässt übergebene Dateien durchsickern, die man weggreppen muss
# Diese Dateien kann man aber im Vorfeld nicht weglassen:
# * ls -R lässt sich nicht wirksam mit ls -d kombinieren
# * Schleife allein (for alles in *) schafft das nicht. Doch, schafft es nun auch:
for alles in backuphauptordner/*/; do ls -AlR "$alles" | grep ^- | cut -d" " -f2 | grep -vw ^1$ | wc -l; ls -Ad "$alles"; done
Echt manchmal bisschen schwer, sowas mit ALLEN Bedenken in EINE Zeile zu bekommen (die noch lesbar, also kein richtiges Script mit vielen "\" ist). Wer jetzt denkt, ha, is doch einfach, soll doch selber mal bisschen damit rumspielen...ich bin nun jedenfalls schon ewig drüber.
@ Susegecko:
Wäre nett, wenn du auch diesen Befehl mal ausführen würdest. Keine Sorge vor dem /dev/null, dass unterdrückt lediglich Fehlermeldungen (Fehlerkanal 2), du kannst es aber auch weglassen, wenn es keine Fehler gibt (bzw. diese dürften die Berechnung ohnehin nicht beeinflussen oder wenn doch, dann nicht stark verzerren). Ich meine diesen von oben:
sudo -i && for alles in backuphauptordner/*/; do ls -Ad "$alles"; ls -AlR "$alles" | grep ^- | cut -d" " -f2 | grep -vw ^1$ | wc -l; done
Anmerkung: Paar unsauber wirkende greps hätte man mit find mit mehreren exec sicherlich verhindern können, aber das ging dann im Gebastel unter, da ich auch ls testen wollte. Funktioniert wenigstens, aber das nächste mal hätte ich find sicherlich schneller zusammen. Test (für mich):
# Syntax: klappt so nicht:
sudo find hard -mindepth 1 -maxdepth 1 -type d 2>/dev/null -exec ls -Ad "{}" ";" -exec ls -AlR "{}" | grep ^- | cut -d" " -f5 | grep -vw ^1$ | wc -l ";"
# Synatx: ";" wieder nach vorn verlegt, aber dann bezieht sich grep
# auf beide exec-Ausgaben (den ganzen find-Befehl)
sudo find hard -mindepth 1 -maxdepth 1 -type d 2>/dev/null -exec ls -Ad "{}" ";" -exec ls -AlR "{}" ";" | grep ^- | cut -d" " -f5 | grep -vw ^1$ | wc -l
Fazit: Ohne Script oder Script-in-one-Line (noch länger und/ oder unlesbarer als sowieso schon - mit mehreren finds verschachtelt im exec) wird das mit find nix...anscheinend.
Und nun noch die letzte Variante, die ich zusätzlich bei mir testen will (und mal wieder mit sudo):
# verkrüppelter Ansatz:
sudo -i && for alles in hauptordner/*; do find -samefile "$alles"; done
# Hier breche ich ab, da man noch eine Schleife und Rekursion
# für den Zähler bräuchte...
Ich hab einfach mal verschiedene Varianten testen wollen, aber die mit samefile ist wohl auch nicht besser - vielleicht lesbarer, aber zwei Schleifen mag ich auch nicht machen...und dann wegen der Rekursion, die mit samefile nicht geht, doch wieder ls -R und grep reinfrickeln/-kopieren...das wird nicht besser, nur eine Schleife und ein bisschen Rumgeteste mehr.
Wen das alles nicht (mehr) interessiert: Mich auch nicht mehr! 👍 Aber eine einfache Lösung , um Hardlinks anzuzeigen, evtl. auch eine GUI, kennt niemand, oder?