Controlla le dimensioni della cartella in Bash


317

Sto provando a scrivere uno script che calcolerà una dimensione di directory e se la dimensione è inferiore a 10 GB e maggiore di 2 GB, fare qualche azione. Dove devo menzionare il nome della mia cartella?

# 10GB
SIZE="1074747474"

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



Poiché questa è una domanda popolare - Se un principiante sta incontrando le risposte su questa domanda e vuole saperne di più su cosa diavolo duè e come tutti conoscono tutti questi comandi: puoi digitare il man dutuo terminale per cercare il comando du nel manuale. Questo mostrerà un output che puoi visualizzare e riassumerà tutti i flag come -h, -c, -s, -b, -B, -apparent-size, ecc. Che le risposte che stai suggerendo di usare. Quindi, puoi decidere tu stesso come utilizzare dual meglio il tuo caso d'uso specifico.
Josh Desmond,

Risposte:


610

Tu puoi fare:

du -h your_directory

che ti darà la dimensione della tua directory di destinazione.

Se vuoi un breve output, du -hcs your_directoryè bello.


15
Non vuoi numeri leggibili dall'uomo quando stai cercando di ottenere un valore per uno script.
risaia

4
Se non viene specificato alcun percorso di directory, verrà automaticamente impostata la directory di lavoro corrente. così du -hs== du -hs ..
razz,

8
Guarda anche: du | sort -nordinerà le directory in base alle loro dimensioni
optimiertes,

3
du -hcs dir_name/*include le sottocartelle
optimiertes

du -h <dir> | coda -1?
Alexander Mills,

143

se vuoi solo vedere le dimensioni della cartella e non le sottocartelle, puoi usare:

du -hs /path/to/directory

Aggiornare:

Dovresti sapere che dumostra lo spazio su disco utilizzato; e non la dimensione del file.

Puoi usarlo --apparent-sizese vuoi vedere la somma delle dimensioni effettive dei file.

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

E ovviamente non c'è bisogno -hdell'opzione (leggibile dall'uomo) all'interno di una sceneggiatura.

Invece è possibile utilizzare -bper un confronto più semplice all'interno dello script.

Ma dovresti notare che si -bapplica --apparent-sizeda solo. E potrebbe non essere quello di cui hai bisogno.

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

quindi penso che dovresti usare --block-sizeo-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

So che sono passati un paio d'anni, ma saresti così gentile da spiegare un po 'qual è lo scopo di regex e BASH_REMATCH nei condizionali? (o per fornire alcuni collegamenti sull'utilizzo di tali variabili / comandi / formati) Mi sarei aspettato che il codice ottenesse semplicemente la dimensione del file in una variabile e confrontasse direttamente con 10 GB, cosa stanno facendo quelle altre cose?
Nordico,

2
@Nordico yup. non è stato necessario regex e BASH_REMATCH, quindi ho aggiornato la risposta.
Taxellool,

29

Utilizzare un riepilogo ( -s) e byte ( -b). Puoi tagliare il primo campo del riepilogo con cut. Mettere tutto insieme:

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

1
Sono nuovo di shell scripting. L'output del comando include il nome della directory. Non sono stato in grado di ottenere solo la parte numerica. "tagliato" nella tua risposta risolto il mistero!
simpleDev

26

Per ottenere solo la dimensione della directory, niente di più:

du --max-depth=0 ./directory

sembra che l'output

5234232       ./directory

5
--max-depthè molto utile per controllare utilmente l'output! per esempio, per avere una buona idea di cosa sta succedendo all'interno di una directory:du -h --max-depth=1
matanster


12

se vuoi solo vedere la dimensione aggregata della cartella e probabilmente in formato MB o GB, prova lo script seguente

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

1
su os x, i flag sono -gper 1-Gbyte e -mper conteggi di 1-Mbyte. viaman du
Sgnl il

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

Se aiuta, puoi anche creare un alias nel tuo .bashrco .bash_profile.

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

Ciò stampa la dimensione della directory corrente o della directory che hai passato come argomento.


Questa è un'ottima risposta
d8aninja,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.