2017-10-04 2 views
-2

Wie berechne ich die Summe der Gesamtgröße mehrerer Dateien in verschiedenen Verzeichnissen? Ich habe eine Textdatei, die den vollständigen Pfad und den Namen der Dateien enthält. Ich stelle dar, ein einfaches Skript, während die Leitung lesen und du -h könnte den Trick tun ...Linux - Summe der Dateien in verschiedenen Verzeichnissen

Example of text file (new2.txt) containing list of files to sum: 

/mount/st4000/media/A/amediafile.ext 
/mount/st4000/media/B/amediafile.ext 
/mount/st4000/media/C/amediafile.ext 
/mount/st4000/media/D/amediafile.ext 
/mount/st4000/media/E/amediafile.ext 
/mount/st4000/media/F/amediafile.ext 
/mount/st4000/media/G/amediafile.ext 
/mount/st4000/media/H/amediafile.ext 
/mount/st4000/media/I/amediafile.ext 
/mount/st4000/media/J/amediafile.ext 
/mount/st4000/media/K/amediafile.ext 

Hinweis: Die Ordnerstruktur wie in A..K nicht unbedingt in Folge ist

Basierend auf den Vorschlag von AndreaT, es leicht anzupassen, habe ich versucht,

while read mediafile;do du -b "$mediafile"|cut -f -1>>subtotals.txt;done<new2.txt 

subtotals.txt sieht aus wie

733402685 
944869798 
730564608 
213768 
13332480 
366983168 
6122559750 
539944960 
735039488 
1755005744 
733478912 

Um alle Teilsummen

sum=0; while read num; do ((sum += num)); done < subtotals.txt; echo $sum 
+0

Post-Dateien Pfadstruktur und erwartetes Ergebnis – RomanPerekhrest

Antwort

0

diese Datei eingegeben wird, wie diese ls -l ist

/home/administrator/filesum/cliprdr.c 
/home/administrator/filesum/cliprdr.h 
/home/administrator/filesum/event.c 
/home/administrator/filesum/event.h 
/home/administrator/filesum/main.c 
/home/administrator/filesum/main.h 
/home/administrator/filesum/utils.c 
/home/administrator/filesum/utils.h 

und das Ergebnis des Befehls Angenommen

-rw-r--r-- 1 administrator administrator 13452 Oct 4 17:56 cliprdr.c 
-rw-r--r-- 1 administrator administrator 1240 Oct 4 17:56 cliprdr.h 
-rw-r--r-- 1 administrator administrator 8141 Oct 4 17:56 event.c 
-rw-r--r-- 1 administrator administrator 2164 Oct 4 17:56 event.h 
-rw-r--r-- 1 administrator administrator 32403 Oct 4 17:56 main.c 
-rw-r--r-- 1 administrator administrator 1074 Oct 4 17:56 main.h 
-rw-r--r-- 1 administrator administrator 5452 Oct 4 17:56 utils.c 
-rw-r--r-- 1 administrator administrator 1017 Oct 4 17:56 utils.h 

der einfachste Befehl auszuführen ist:

cat filelist.txt | du -cb | tail -1 | cut -f -1 

mit Ausgang folgenden (in Bytes)

69370 

Denken Sie daran, dass du die tatsächliche Plattennutzung auf ein Vielfaches von (normalerweise) 4 KB anstelle der logischen Dateigröße aufrundet. Für kleine Dateien ist diese Approximation möglicherweise nicht akzeptabel.

+0

jede der Dateien sind 100 von MB in der Größe, so dass die Rundung von 4KB kein Problem sein wird –

+0

Beachten Sie, dass 'du-b' ist keine universell verfügbare Option. Auf welchem ​​Unix-System findest du das? – ghoti

+0

@ghoti, ich benutze Linux Mint Cinnamon 18.2. '-b' scheint äquivalent zu' --apparent-size --block-size = 1' zu sein –

0

ein Verzeichnis Um es zusammenzufassen, müssen Sie eine Weile tun, und exportieren Sie das Ergebnis an die übergeordnete Shell hinzufügen. verwendete ich ein Echo eine der nachfolgenden eval:

eval ' let sum=0$(
     ls -l | tail -n +2 |\ 
     while read perms link user uid size date day hour name ; do 
      echo -n "+$size" ; 
     done 
    )' 

Es produziert eine Linie, direkt ausgewertet, die

let sum=0+205+1201+1201+1530+128+99 

Sie nur zweimal diesen Befehl reproduzieren müssen auf beiden Ordnern wie

aussieht.

+0

Könnten Sie bitte Ihre Antwort für die Änderungen, die ich gemacht habe, anpassen? –

0

Der Befehl du hat keine -b Option auf den Unix-Systemen, die ich zur Verfügung habe. Und es gibt andere Möglichkeiten, die Dateigröße zu erhalten.

Angenommen, Sie die Idee einer while-Schleife in bash möchten, können folgende Arbeiten:

#!/bin/bash 

case "$(uname -s)" in 
    Linux)  stat_opt=(-c '%s') ;; 
    *BSD|Darwin) stat_opt=(-f '%z') ;; 
    *) printf 'ERROR: I don'\''t know how to run on %s\n' "$(uname -s)" ;; 
esac 

declare -i total=0 
declare -i count=0 
declare filename 

while read filename; do 
    [[ -f "$filename" ]] || continue 
    ((total+=$(stat "${stat_opt[@]}" "$filename"))) 
    ((count++)) 
done 

printf 'Total: %d bytes in %d files.\n' "$total" "$count" 

Diese Liste der Dateien als stdin nehmen würde. Sie können es in BSD Unix oder in Linux ausführen - die Optionen zum Befehl stat (der nicht intern in bash ist) sind die Bits, die plattformspezifisch sind.

Verwandte Themen