I'm trying to calculate the total size in bytes of all files (in a directory tree) matching a filename pattern just using the shell. This is what I have so far:
find -name *.undo -exec stat -c%s {} \; | awk '{total += $1} END {print total}'
Is there an easier way to do this? I feel like there should be a simple du or find switch that does this for me but I can't find one.
To be clear I want to total files matching a pattern anywhere under a directory tree which means
du -bs *.undo
won't work because it only matches the files in the current directory.
This will print the total on the last line of output.
I have been looking at this problem too (only a year later...) - only just found this page.
Something that I found works (for me) is the following:
This will return the total size of all the .avi files in all the sub-folders below /mnt/iso
I have to give credit to radoulov for the paste command - see this page: Shell command to sum integers, one per line?
Just to add - just in case a folder matches the search term - it's a good idea to use
-type f
in the find command too.I think the version with xargs could be imroved (simplified) ls -1 *.undo | xargs wc
Perl one-liner:
The
@F
autosplit array starts at index$F[0]
while awk fields start with $1, hence$F[6]
is used instead of awk's$7
Python is part of most linux distributions.
Longish, but perfectly clear and highly extensible.