Überprüfen Sie die Ordnergröße in Bash


316

Ich versuche, ein Skript zu schreiben, das eine Verzeichnisgröße berechnet. Wenn die Größe weniger als 10 GB und mehr als 2 GB beträgt, führen Sie eine Aktion aus. Wo muss ich meinen Ordnernamen angeben?

# 10GB
SIZE="1074747474"

# check the current size
CHECK="`du /data/sflow_log/`"
if [ "$CHECK" -gt "$SIZE" ]; then
  echo "DONE"
fi

1
Und wenn Sie es sortieren möchten: serverfault.com/questions/62411/…
cregox


Da dies eine beliebte Frage ist - Wenn ein Anfänger auf die Antworten auf diese Frage stößt und mehr darüber erfahren möchte, was zum Teufel duist und wie jeder diese Befehle kennt: Sie können man duIhr Terminal eingeben, um den Befehl du im Handbuch nachzuschlagen. Dies zeigt eine Ausgabe an, die Sie anzeigen können, und fasst alle Flags wie -h, -c, -s, -b, -B, -apparent-size usw. zusammen, deren Antworten Sie vorschlagen. Dann können Sie selbst entscheiden, wie Sie es am besten dufür Ihren speziellen Anwendungsfall verwenden möchten .
Josh Desmond

Antworten:


608

Du kannst tun:

du -h your_directory

Dadurch erhalten Sie die Größe Ihres Zielverzeichnisses.

Wenn Sie eine kurze Ausgabe wünschen, du -hcs your_directoryist schön.


15
Sie möchten keine für Menschen lesbaren Zahlen, wenn Sie versuchen, einen Wert für ein Skript zu erhalten.
Reis

4
Wenn kein Verzeichnispfad angegeben ist, wird standardmäßig das aktuelle Arbeitsverzeichnis verwendet. also du -hs== du -hs ..
Razz

8
du | sort -n
Schauen

3
du -hcs dir_name/*enthält die Unterordner
optimiertes

du -h <dir> | Schwanz -1?
Alexander Mills

143

Wenn Sie nur die Ordnergröße und nicht die Unterordner anzeigen möchten, können Sie Folgendes verwenden:

du -hs /path/to/directory

Aktualisieren:

Sie sollten wissen, dass duder verwendete Speicherplatz angezeigt wird. und nicht die Dateigröße.

Sie können verwenden, --apparent-sizewenn Sie die Summe der tatsächlichen Dateigrößen anzeigen möchten.

--apparent-size
      print  apparent  sizes,  rather  than  disk  usage; although the apparent size is usually smaller, it may be larger due to holes in ('sparse')
      files, internal fragmentation, indirect blocks, and the like

Und natürlich ist in einem Skript keine -h(vom Menschen lesbare) Option erforderlich .

Stattdessen können Sie verwenden -b zum leichteren Vergleich innerhalb des Skripts verwenden.

Sie sollten jedoch beachten, dass dies -bfür sich --apparent-sizeselbst gilt. Und es könnte nicht das sein, was Sie brauchen.

-b, --bytes
      equivalent to '--apparent-size --block-size=1'

also ich denke, du solltest --block-sizeoder verwenden-B

#!/bin/bash
SIZE=$(du -B 1 /path/to/directory | cut -f 1 -d "   ")    
# 2GB = 2147483648 bytes
# 10GB = 10737418240 bytes
if [[ $SIZE -gt 2147483648 && $SIZE -lt 10737418240 ]]; then
    echo 'Condition returned True'
fi

Ich weiß, es ist ein paar Jahre her, aber würden Sie so freundlich sein, ein wenig zu erklären, was der Zweck von Regex und BASH_REMATCH in den Bedingungen ist? (oder um einige Links zur Verwendung dieser Variablen / Befehle / Formate bereitzustellen) Ich hätte erwartet, dass der Code nur die Größe der Datei in einer Variablen erhält und diese direkt mit 10 GB vergleicht. Was machen diese anderen Dinge?
Nordico

2
@Nordico yup. Regex und BASH_REMATCH waren nicht erforderlich, daher habe ich die Antwort aktualisiert.
Taxellool

-bfunktioniert nur unter GNU du, nicht unter BSD
leetbacoon

29

Verwenden Sie eine Zusammenfassung ( -s) und Bytes ( -b). Sie können das erste Feld der Zusammenfassung mit ausschneiden cut. Alles zusammen:

CHECK=$(du -sb /data/sflow_log | cut -f1)

1
Ich bin neu im Shell-Scripting. Die Ausgabe des Befehls du enthielt den Verzeichnisnamen. Ich konnte nicht nur einen Teil der Nummer bekommen. "Schnitt" in Ihrer Antwort löste das Rätsel!
simpleDev

26

Um nur die Größe des Verzeichnisses zu ermitteln, nichts weiter:

du --max-depth=0 ./directory

Ausgabe sieht aus wie

5234232       ./directory

5
--max-depthist sehr nützlich, um die Ausgabe sinnvoll zu steuern! Zum Beispiel, um eine gute Vorstellung davon zu bekommen, was in einem Verzeichnis vor sich geht:du -h --max-depth=1
Matanster

15

Um die Größe aller Verzeichnisse in einem Verzeichnis zu überprüfen, können Sie Folgendes verwenden:

du -h --max-depth=1


5
oder du -h -d 1auf Android.
Jiggunjer

5
und du -h -d 1auf OSX
Mike W

12

Wenn Sie nur die Gesamtgröße des Ordners und wahrscheinlich im MB- oder GB-Format anzeigen möchten, versuchen Sie bitte das folgende Skript

$du -s --block-size=M /path/to/your/directory/

1
auf os x sind die Flags -gfür 1-Gbyte- und -mfür 1- Mbyte -Zählungen. viaman du
Sgnl

5
# 10GB
SIZE="10"


# check the current size
CHECK="`du -hs /media/662499e1-b699-19ad-57b3-acb127aa5a2b/Aufnahmen`"
CHECK=${CHECK%G*}
echo "Current Foldersize: $CHECK GB"

if (( $(echo "$CHECK > $SIZE" |bc -l) )); then
        echo "Folder is bigger than $SIZE GB"
else
        echo "Folder is smaller than $SIZE GB"
fi

4

Wenn es hilft, können Sie auch einen Alias ​​in Ihrem .bashrcoder erstellen .bash_profile.

function dsize()
{
    dir=$(pwd)
    if [ "$1" != "" ]; then
            dir=$1
    fi
    echo $(du -hs $dir)
}

Dies gibt die Größe des aktuellen Verzeichnisses oder des Verzeichnisses aus, das Sie als Argument übergeben haben.


Dies ist eine großartige Antwort
d8aninja
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.