Sprawdź rozmiar folderu w Bash


316

Próbuję napisać skrypt, który obliczy rozmiar katalogu, a jeśli rozmiar jest mniejszy niż 10 GB, a większy niż 2 GB, wykonaj jakieś czynności. Gdzie muszę podać nazwę mojego folderu?

# 10GB
SIZE="1074747474"

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

1
A jeśli chcesz to posortować: serverfault.com/questions/62411/…
cregox


Ponieważ jest to popularne pytanie - jeśli ktoś początkujący napotyka odpowiedzi na to pytanie i chce dowiedzieć się więcej o tym, do cholery, dui jak wszyscy znają wszystkie te polecenia: możesz wpisać man duw terminalu, aby wyszukać polecenie du w instrukcji. Spowoduje to wyświetlenie wyniku, który można wyświetlić, i podsumuje wszystkie flagi, takie jak -h, -c, -s, -b, -B, --apparent-size itp., Których odpowiedzi sugerujesz użyć. Następnie możesz sam zdecydować, jak najlepiej wykorzystać dukonkretny przypadek użycia.
Josh Desmond

Odpowiedzi:


608

Możesz to zrobić:

du -h your_directory

co da ci rozmiar twojego katalogu docelowego.

Jeśli chcesz krótkie wyjście, du -hcs your_directoryjest miło.


15
Nie chcesz liczb czytelnych dla ludzi, gdy próbujesz uzyskać wartość dla skryptu.
paddy

4
Bez określonej ścieżki do katalogu domyślnie będzie to bieżący katalog roboczy. więc du -hs== du -hs ..
razz

8
Zobacz także: du | sort -nposortuje katalogi według rozmiaru
optymiertes

3
du -hcs dir_name/*obejmuje podfoldery
optimiertes

du -h <katalog> | ogon -1?
Alexander Mills,

143

jeśli chcesz zobaczyć rozmiar folderu, a nie podfoldery, możesz użyć:

du -hs /path/to/directory

Aktualizacja:

Powinieneś wiedzieć, że dupokazuje używane miejsce na dysku; a nie rozmiar pliku.

Możesz użyć, --apparent-sizejeśli chcesz zobaczyć sumę rzeczywistych rozmiarów plików.

--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

I oczywiście -hw skrypcie nie ma potrzeby opcji (Czytelny dla człowieka).

Zamiast tego możesz użyć -bdla łatwiejszego porównania w skrypcie.

Należy jednak pamiętać, że -bdotyczy to --apparent-sizesamo w sobie. I może nie być to, czego potrzebujesz.

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

więc myślę, że powinieneś użyć --block-sizelub-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

Wiem, że minęło kilka lat, ale czy byłbyś tak uprzejmy, aby wyjaśnić trochę, jaki jest cel wyrażeń regularnych i BASH_REMATCH w warunkach warunkowych? (lub aby podać linki do użycia tych zmiennych / poleceń / formatów) Spodziewałbym się, że kod po prostu uzyska rozmiar pliku w zmiennej i porówna to bezpośrednio z 10 gb, co te inne rzeczy robią?
Nordico,

2
@Nordico yup. nie było potrzeby wyrażeń regularnych i BASH_REMATCH, więc zaktualizowałem odpowiedź.
Taxellool

29

Użyj podsumowania ( -s) i bajtów ( -b). Możesz wyciąć pierwsze pole podsumowania za pomocą cut. Kładąc wszystko razem:

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

1
Jestem nowy w skryptowaniu powłoki. Dane wyjściowe polecenia du zawierały nazwę katalogu. Nie byłem w stanie uzyskać tylko części liczbowej. „Wytnij” w twojej odpowiedzi rozwiązało zagadkę!
simpleDev

26

Aby uzyskać tylko rozmiar katalogu, nic więcej:

du --max-depth=0 ./directory

wygląda jak

5234232       ./directory

5
--max-depthjest bardzo przydatny do użytecznego sterowania wyjściem! na przykład, aby uzyskać dobre pojęcie o tym, co dzieje się w katalogu:du -h --max-depth=1
matanster,


12

jeśli chcesz zobaczyć łączny rozmiar folderu i prawdopodobnie w formacie MB lub GB, wypróbuj poniższy skrypt

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

1
w systemie OS X flagi dotyczą 1-Gbyte -gi -m1-Mbyte. przezman 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

Jeśli to pomoże, możesz także utworzyć alias w swoim .bashrclub .bash_profile.

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

Spowoduje to wydrukowanie rozmiaru bieżącego katalogu lub katalogu przekazanego jako argument.


To świetna odpowiedź
d8aninja
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.