I'm trying to write a script that will calculate a directory size and if the size is less than 10GB, and greater then 2GB do some action. Where do I need to mention my folder name?
# 10GB
SIZE="1074747474"
# check the current size
CHECK="`du /data/sflow_log/`"
if [ "$CHECK" -gt "$SIZE" ]; then
echo "DONE"
fi
du
is and how everyone knows all these commands: You can type man du
in your terminal to lookup the du command in the manual. This will display an output which you can view, and will summarize all the flags like -h, -c, -s, -b, -B, --apparent-size, etc. that answers are you suggesting you use. Then, you can decide for yourself how you best want to use du
for your specific use case.
You can do:
du -hs your_directory
which will give you a brief output of the size of your target directory. Using a wildcard like *
can select multiple directories.
If you want a full listing of sizes for all files and sub-directories inside your target, you can do:
du -h your_directory
Tips:
Add the argument -c to see a Total line at the end. Example: du -hcs or du -hc.
Remove the argument -h to see the sizes in exact KiB instead of human-readable MiB or GiB formats. Example: du -s or du -cs.
if you just want to see the folder size and not the sub-folders, you can use:
du -hs /path/to/directory
Update:
You should know that du
shows the used disk space; and not the file size.
You can use --apparent-size
if u want to see sum of actual file sizes.
--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
And of course theres no need for -h
(Human readable) option inside a script.
Instead You can use -b
for easier comparison inside script.
But You should Note that -b
applies --apparent-size
by itself. And it might not be what you need.
-b, --bytes
equivalent to '--apparent-size --block-size=1'
so I think, you should use --block-size
or -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
Use a summary (-s
) and bytes (-b
). You can cut the first field of the summary with cut
. Putting it all together:
CHECK=$(du -sb /data/sflow_log | cut -f1)
To just get the size of the directory, nothing more:
du --max-depth=0 ./directory
output looks like
5234232 ./directory
--max-depth
is very useful for usefully controlling the output! for example, to get a good notion of what's going on inside a directory: du -h --max-depth=1
To check the size of all of the directories within a directory, you can use:
du -h --max-depth=1
if you just want to see the aggregate size of the folder and probably in MB or GB format, please try the below script
$du -s --block-size=M /path/to/your/directory/
-g
for 1-Gbyte and -m
for 1-Mbyte counts. via man du
# 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
If it helps, You can also create an alias in your .bashrc
or .bash_profile
.
function dsize()
{
dir=$(pwd)
if [ "$1" != "" ]; then
dir=$1
fi
echo $(du -hs $dir)
}
This prints the size of the current directory or the directory you have passed as an argument.
$dir
when passing it to du
to prevent word splitting for the value of $dir
. Wrapping the call to du
into echo $(…)
seems redundant. Instead of calling pwd
you can use the builtin Bash variable ${PWD}
. For checking if a variable is set, I suggest [ -v varname ]
.
Success story sharing
du -hs
==du -hs .
.du | sort -n
it will sort the directories by its sizedu -hcs dir_name/*
includes the subfolders