2009-07-15 3 views
32

Zum Beispiel habe ich ein großes Dateisystem, das schneller als ich erwartet füllt. Also ich suche, was hinzugefügt wird:Gesamtgröße der Gruppe von Dateien mit 'Find' ausgewählt

find /rapidly_shrinking_drive/ -type f -mtime -1 -ls | less 

Und ich finde, nun, viele Sachen. Tausende Dateien von sechs bis sieben Arten. Ich kann eine Art heraus und sie zählen:

find /rapidly_shrinking_drive/ -name "*offender1*" -mtime -1 -ls | wc -l 

aber was ich wirklich möchte in der Lage sein, die Gesamtgröße auf dem Datenträger dieser Dateien zu erhalten:

find /rapidly_shrinking_drive/ -name "*offender1*" -mtime -1 | howmuchspace 

Ich bin offen zu einem Perl-Einzeiler dafür, wenn jemand einen hat, aber ich werde keine Lösung verwenden, die ein mehrzeiliges Skript oder File :: Find beinhaltet.

Antwort

55

Der Befehl du informiert Sie über die Festplattennutzung. Beispiel zur Nutzung für Ihren speziellen Fall:

find rapidly_shrinking_drive/ -name "offender1" -mtime -1 -print0 | du --files0-from=- -hc | tail -n1 

(Früher schrieb ich du -hs, aber auf meiner Maschine, die find ‚s Eingang und stattdessen einen Überblick über die Größe des cwd außer Acht zu lassen scheint.)

+0

Sehr schön. Obwohl, erinnern, dass brutale Schlüsselwort zu "finden" ("--files0-from =") möglicherweise nicht einfacher als sich an die awk-Sequenz erinnern. –

+1

Mit 'du' Version 8.13 ergibt das folgende Ergebnis:' du -ch/rapid_shrinking_drive/* tender1 * | tail -n1' – jason

+2

Meine Maschine mag die Option '--files0-from =' nicht. ; -/ –

11

Darn, Stephan202 ist Recht. Ich glaube nicht, über du es (zusammenfassen), so stattdessen benutzen ich awk:

find rapidly_shrinking_drive/ -name "offender1" -mtime -1 | du | awk '{total+=$1} END{print total}' 

Ich mag die andere Antwort besser aber, und es ist fast sicher effizienter.

+2

Alternative mit -exec im Fund: 'find rapid_shrinking_drive/-name" tender1 "-mtime -1 -exec du {} \; | awk '{total + = $ 1} ENDE {print total}' – Sylvain

+1

ist es in der Lage, die endgültige Ausgabe in ein besser lesbares Format wie 103M zu konvertieren? – Zen

-1

Sie könnten auch ls -l nutzen, um ihre Größe zu finden, dann awk die Größe zu extrahieren:

find /rapidly_shrinking_drive/ -name "offender1" -mtime -1 | ls -l | awk '{print $5}' | sum 
+0

das ist falsch. ls -l wird nicht benötigt. – ghostdog74

+0

Wenn Sie es auf diese Weise tun, müssen Sie Xargs – spookypeanut

6

mit GNU finden,

find /path -name "offender" -printf "%s\n" | awk '{t+=$1}END{print t}' 
+0

+1 für die ausdrückliche Erwähnung von GNU finden. (Zu schlecht ist es so weniger tragbar). – Hennes

1

Ich habe alle diese Befehle versucht, aber kein Glück. So habe ich dieses hier gefunden, die mir eine Antwort gibt:

find . -type f -mtime -30 -exec ls -l {} \; | awk '{ s+=$5 } END { print s }' 
3

Ich möchte Jasons Kommentar oben auf den Status der Antwort fördern, weil ich es ist die mnemonic (wenn auch nicht die allgemeinste glauben, wenn Sie müssen wirklich die Dateiliste von find) haben:

$ du -hs *.nc 
6.1M foo.nc 
280K foo_region_N2O.nc 
8.0K foo_region_PS.nc 
844K foo_region_xyz.nc 
844K foo_region_z.nc 
37M ETOPO1_Ice_g_gmt4.grd_region_zS.nc 
$ du -ch *.nc | tail -n 1 
45M total 
$ du -cb *.nc | tail -n 1 
47033368 total