Der Martin: Linux: Aufgabe für die Kommandozeile

Hallo,

ich knoble gerade, wie ich unter Linux die Gesamtgröße aller Dateien in einem bestimmten Verzeichnisbaum ermitteln kann, ohne den Filesystem-bedingten Overhead dabei mitzurechnen.

Mit 'ls' bin ich nicht weit gekommen. Ich dachte anfangs, die Angabe "total: ..." am Anfang des Listings wäre zu gebrauchen, vor allem in Verbindung mit -R. Aber dann habe ich festgestellt, dass diese Zahl die Anzahl der belegten Blocks im Filesystem angibt, und die korreliert offenbar nur sehr vage mit der Dateigröße. Bei meinen Tests hat sie zwar immer größenordnungsmäßig gestimmt, war aber nur als Schätzwert brauchbar.

Dann kam ich auf 'du', das immerhin die tatsächlichen Dateigrößen aufsummiert, und mit

du -bcs /media/usbdisk/*

war ich schon nah dran. Allerdings schließt 'du' auch den Platzbedarf von Verzeichnissen selbst mit ein (bei meinen Versuchen immer 4k pro Verzeichnis). Die möchte ich aber nicht mitgezählt haben.

Alte Hasen vor! Wer kann mir den entscheidenden Tipp geben?

Ciao,
 Martin

--
Der Sinn einer Behörde besteht in ihrer Existenz.
  (alte Beamtenweisheit)
Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
  1. Tach,

    war ich schon nah dran. Allerdings schließt 'du' auch den Platzbedarf von Verzeichnissen selbst mit ein (bei meinen Versuchen immer 4k pro Verzeichnis). Die möchte ich aber nicht mitgezählt haben.

    echo $((find /media/usbdisk/\* -type d |wc -l*4096)) von der gefundenen Summe abziehen?

    mfg
    Woodfighter

    1. Tach,

      echo $((find /media/usbdisk/\* -type d |wc -l*4096)) von der gefundenen Summe abziehen?

      zu Ende gedacht:

      find Desktop/* '!' -type d -print0|du -bcs --files0-from=-

      mfg
      Woodfighter

      1. Hallo,

        echo $((find /media/usbdisk/\* -type d |wc -l*4096)) von der gefundenen Summe abziehen?

        so ähnlich habe ich das bisher "zu Fuß" getan. Aber ist es so einfach? Wird für ein Verzeichnis immer 4k reserviert? Je nach Zahl der Einträge wächst es vermutlich irgendwann. Zumindest in FAT-Dateisystemen, die man ja auf externen Datenträgern der Kompatibilität wegen häufig verwendet, ist der Platzbedarf für ein Verzeichnis sehr unterschiedlich.

        zu Ende gedacht:
        find Desktop/* '!' -type d -print0|du -bcs --files0-from=-

        Ich nehme an, dass Desktop/* hier als Platzhalter steht? Sonst würde es mich verwirren, wieso hier der Desktop ins Spiel kommen sollte.
        Hmm, ja, das ist auf jeden Fall ein interessanter Ansatz. Das Endergebnis ist das, was ich haben möchte; auf die Zwischensumme, die 'du' für die einzelnen Verzeichnisse angezeigt hätte, muss ich dann aber wohl verzichten. Naja, man kann nicht alles haben ...

        Ciao,
         Martin

        --
        F: Wer ist der Herrscher über Wasser, Wind und Wellen?
        A: Der Friseur.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. Tach,

          so ähnlich habe ich das bisher "zu Fuß" getan. Aber ist es so einfach? Wird für ein Verzeichnis immer 4k reserviert?

          im Falle von ext2/3/4, wie andere Dateisysteme das handhaben, weiß ich nicht: nein, das Verzeichnis wächst mit der Anzahl der gleichzeitig vorhandenen Dateien darin (und schrumpft auch nicht wieder); 4k als Startwert entspricht einem Block.

          Zumindest in FAT-Dateisystemen, die man ja auf externen Datenträgern der Kompatibilität wegen häufig verwendet

          Zur Kompatibilität zu was braucht man denn noch FAT?

          zu Ende gedacht:
          find Desktop/* '!' -type d -print0|du -bcs --files0-from=-

          Ich nehme an, dass Desktop/* hier als Platzhalter steht? Sonst würde es mich verwirren, wieso hier der Desktop ins Spiel kommen sollte.

          Das war einfach nur mein Testverzeichnis.

          mfg
          Woodfighter

          1. Hi,

            Wird für ein Verzeichnis immer 4k reserviert?
            im Falle von ext2/3/4, wie andere Dateisysteme das handhaben, weiß ich nicht: nein, das Verzeichnis wächst mit der Anzahl der gleichzeitig vorhandenen Dateien darin (und schrumpft auch nicht wieder); 4k als Startwert entspricht einem Block.

            das dachte ich mir, also kann man nicht einfach mit der Faust 4096 als Konstante einsetzen.

            Zumindest in FAT-Dateisystemen, die man ja auf externen Datenträgern der Kompatibilität wegen häufig verwendet
            Zur Kompatibilität zu was braucht man denn noch FAT?

            Zur Kompatibilität bzw. zum Datenaustausch mit Windows-Nutzern und vielen Nicht-PC-Geräten. NTFS ist auf externen Datenträgern problematisch, wenn man sie zwischen verschiedenen Windows-PCs austauscht; einige Geräte (manche Digitalkameras, Oszilloskope und andere Messgeräte) unterstützen gar nur FAT16. Also bleibt nur FAT32, sofern man den Windows-Anwendern nicht den ext2/ext3-Treiber für Windows aufzwingen kann/will, und vereinzelt muss man sogar FAT16 nehmen.

            Ciao,
             Martin

            --
            Man ist so alt, wie man sich fühlt.
            Aber niemals so wichtig.
            Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
            1. Tach,

              Zur Kompatibilität bzw. zum Datenaustausch mit Windows-Nutzern und vielen Nicht-PC-Geräten. NTFS ist auf externen Datenträgern problematisch, wenn man sie zwischen verschiedenen Windows-PCs austauscht;

              habe mit NTFS bisher keinerlei Probleme gehabt, wie äußern die sich?

              mfg
              Woodfighter

              1. Hi,

                Zur Kompatibilität bzw. zum Datenaustausch mit Windows-Nutzern und vielen Nicht-PC-Geräten. NTFS ist auf externen Datenträgern problematisch, wenn man sie zwischen verschiedenen Windows-PCs austauscht;
                habe mit NTFS bisher keinerlei Probleme gehabt, wie äußern die sich?

                ich kenne mehrere Fälle, wo eine externe NTFS-formatierte Platte an Rechner A einwandfrei läuft, uneingeschränkter Vollzugriff für alle Nutzer. Dieselbe Platte dann an Rechner B angeschlossen, und dort darf niemand auf die Daten zugreifen. Als Administrator anmelden, Zugriffsrechte ändern auf Vollzugriff für alle, übernehmen für alle untergeordneten Dateien und Verzeichnisse. Und geht. Beim Zurückstöpseln an Rechner A (oder einen beliebigen anderen Windows-PC) wieder dasselbe Spiel. Jedesmal muss nach dem Anschließen der Platte erst der Administrator wieder den Zugriff auf die Daten erlauben.
                Die beteiligten PCs haben überwiegend Win7, ein paar XP-Büchsen sind noch dabei.

                So long,
                 Martin

                --
                Die neue E-Mailadresse des Papstes: mailto:urbi@orbi
                Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
  2. Hallo,

    klar im Zeitalter von TB-Platten muss man sich nicht mehr soviel Gedanken machen passt das was man da sichert/kopiert...

    Hier... versuch das mal!

    find . -type f  -print0 | xargs -0 /bin/ls -l   | awk ' {a=a+$5; printf("%1.0f %1.0f \n", $5, a);  } '

    Nachrechnen musst du selbst! :-)

    Ulli

    PS: 15min

    1. Hi,

      klar im Zeitalter von TB-Platten muss man sich nicht mehr soviel Gedanken machen passt das was man da sichert/kopiert...

      den Kommentar habe ich vermutlich nicht ganz verstanden. Was willst du damit sagen?

      find . -type f  -print0 | xargs -0 /bin/ls -l   | awk ' {a=a+$5; printf("%1.0f %1.0f \n", $5, a);  } '

      Nachrechnen musst du selbst! :-)

      Ich hab's nicht ausprobiert, aber rein vom Anschauen und von der Theorie her - auch eine nette Variante.
      Nur: Wozu %1.0f als Ausgabe-Template? Alle vorkommenden Werte sind Ganzzahlen.

      Aber ich habe den Eindruck, es gibt für das, was ich eigentlich wollte, eine einfache out-of-the-box-Lösung, die allein durch geschickte Kombination von Switches das Ziel erreicht. Stattdessen erreichen die Lösungen eine Komplexität, bei der ich schon lieber ein paar Zeilen C-Code schreibe und dann eine für mich optimale Lösung habe.

      Danke trotzdem allen, die mitgeholfen haben.

      PS: 15min

      Ähm, wie bitte?

      Ciao,
       Martin

      PS: Es ist weder nötig, noch nützlich, das Posting nochmal per e-Mail zu duplizieren. Wenn jemand hier eine Frage stellt, sollte man davon ausgehen, dass er/sie auch hier nach Antworten sucht.

      --
      Kriege kennen keinen Gewinner. Es gibt nur Verlierer und das sind wir.
        (Hotti)
      Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
      1. Tach,

        Ich hab's nicht ausprobiert, aber rein vom Anschauen und von der Theorie her - auch eine nette Variante.

        ergibt bei mir den selben Wert wie die Version mit du (sofern ich da auch die Einschränkung von file entsprechend anpasse).

        Aber ich habe den Eindruck, es gibt für das, was ich eigentlich wollte, eine einfache out-of-the-box-Lösung, die allein durch geschickte Kombination von Switches das Ziel erreicht.

        „This is the Unix philosophy: Write programs that do one thing and do it well. Write programs to work together. Write programs to handle text streams, because that is a universal interface.“ Du stößt hier haltan die Grenzen, weil deine Anfrage nach nur gewissen Dateitypen nicht von du bewältigt werden kann, aber zum Glück hilft Satz 2 dabei, dass man das mal eben „zusammenpipen“ kann.

        PS: 15min

        Ähm, wie bitte?

        Ich vermute mal, die Zeit, die es ihn gekostet hat, das Problem zu lösen.

        mfg
        Woodfighter

        1. Hallo,

          Aber ich habe den Eindruck, es gibt für das, was ich eigentlich wollte, eine einfache out-of-the-box-Lösung, die allein durch geschickte Kombination von Switches das Ziel erreicht.
          „This is the Unix philosophy: Write programs that do one thing and do it well. Write programs to work together. Write programs to handle text streams, because that is a universal interface.“ Du stößt hier haltan die Grenzen, weil deine Anfrage nach nur gewissen Dateitypen nicht von du bewältigt werden kann, aber zum Glück hilft Satz 2 dabei, dass man das mal eben „zusammenpipen“ kann.

          ja, das mag stimmen, und grundsätzlich bin ich auch ein Anhänger der zitierten Philosophie. Wenn mir aber die dadurch favorisierte modulare Lösung durch geschicktes Kombinieren komplizierter erscheint, als ein paar Zeilen Programmcode, weiche ich gern davon ab - vor allem, wenn es um eine Anforderung geht, die sehr häufig auftritt, so wie hier.

          PS: 15min
          Ähm, wie bitte?
          Ich vermute mal, die Zeit, die es ihn gekostet hat, das Problem zu lösen.

          Kann sein. Die Angabe allein war aber ohne Worte etwas kryptisch.

          Ciao,
           Martin

          --
          Ich verdanke meinen Eltern so viel - besonders meiner Mutter und meinem Vater.
            (Dakota Fanning, US-Nachwuchsschauspielerin)
          Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
          1. Tach,

            ja, das mag stimmen, und grundsätzlich bin ich auch ein Anhänger der zitierten Philosophie. Wenn mir aber die dadurch favorisierte modulare Lösung durch geschicktes Kombinieren komplizierter erscheint, als ein paar Zeilen Programmcode, weiche ich gern davon ab - vor allem, wenn es um eine Anforderung geht, die sehr häufig auftritt, so wie hier.

            hmm, wenn dir eine Pipe und zwei Programmaufrufe schon zu kompliziert sind, kommst du damit aber nicht weit.

            mfg
            Woodfighter

            1. Hi,

              Wenn mir aber die dadurch favorisierte modulare Lösung durch geschicktes Kombinieren komplizierter erscheint, als ein paar Zeilen Programmcode, weiche ich gern davon ab - vor allem, wenn es um eine Anforderung geht, die sehr häufig auftritt, so wie hier.
              hmm, wenn dir eine Pipe und zwei Programmaufrufe schon zu kompliziert sind, kommst du damit aber nicht weit.

              bei Ullis Vorschlag waren es immerhin schon drei Programmaufrufe, und ich hätte mich erstmal in awk einarbeiten müssen, das ich bisher nur vom Hörensagen kenne. Denn einfach abkupfern ohne zu verstehen ist nicht meine Art. Das hätte aber auf jeden Fall mehr Zeit gebraucht als "mal schnell selber schreiben".

              Und deine Lösung ist zwar technisch weniger anspruchsvoll, hat dafür aber auch nicht ganz den Komfort (Anzeige von Zwischensummen je Verzeichnis), den ich mir gewünscht hätte. Auch hier gilt bei mir: Mal ein oder zwei Stunden recherchieren ist okay, aber wenn ich in der Zeit nichts finde, was meine Ansprüche komplett abdeckt, ist Selbermachen auch wieder die nächste Option. Macht außerdem viel mehr Spaß.

              Ciao,
               Martin

              --
              Zwei Dinge sind unendlich: Das Universum und die menschliche Dummheit. Beim Universum bin ich mir aber nicht ganz sicher.
                (Albert Einstein, deutscher Physiker)
              Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
  3. Tach,

    war ich schon nah dran. Allerdings schließt 'du' auch den Platzbedarf von Verzeichnissen selbst mit ein (bei meinen Versuchen immer 4k pro Verzeichnis). Die möchte ich aber nicht mitgezählt haben.

    was ich noch fragen wollte: Wozu das ganze eigentlich?

    mfg
    Woodfighter

    1. Hallo,

      war ich schon nah dran. Allerdings schließt 'du' auch den Platzbedarf von Verzeichnissen selbst mit ein (bei meinen Versuchen immer 4k pro Verzeichnis). Die möchte ich aber nicht mitgezählt haben.
      was ich noch fragen wollte: Wozu das ganze eigentlich?

      Buchhaltung.
      Wenn ich meinen PC frage, wie groß die Menge meiner Fotos, Videos, Audiodateien, ... im Archiv ist, auch nach Kategorien aufgeteilt, dann möchte ich ein exaktes Ergebnis haben, nicht nur "so ungefähr".

      Ciao,
       Martin

      --
      Es sagte...
      ein korpulenter Lehrer zu einem Schüler, der ihn ein Fass genannt hatte: "Nein. Ein Fass ist von Reifen umgeben, ich dagegen von Unreifen."
      Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(