Here are two options; one bash-centric and one just for fun.
( shopt -s globstar dotglob; stat --format "%s %n" -- **/*.log | sort -rn )
This:
- runs in a sub-shell, so that the
shopt
statements don't affect the current/running shell.
- sets the globstar and dotglob shell options; globstar enables the use of the
**
syntax to match files in subdirectories; dotglob enables the shell globbing to match directories that start with a .
stat
is how we gather the file sizes with their names; it's installed by default on CentOS systems -- it is not POSIX-specified.
- the real work here is done by the globstar
**/*.log
, which gathers matching filenames (*.log) in the current directory and any subdirectories.
- we then reverse-numerically sort the file sizes & names to get the largest files first (use
-n
without the r
to sort them in ascending-size order).
Another bash-centric option, but one that also exercises an ls
flag to sort its arguments by size:
shopt -s globstar dotglob
ls -lS **/*.log
# or, in reverse:
ls -lrS **/*.log
To exercise your system and your patience, you could search for files of a specific size in a certain order:
for((i=9223372036854775807;i>=0;i--)); do find . -name \*.log -size ${i}c -exec stat --format "%s %n" {} + ; done
This runs 9,223,372,036,854,775,807 (over 9 quintillion) find
commands, looking for *.log files of every possible size, again calling stat
to display just the file sizes and names. In case there are multiple files of the same size, I included find's {} +
syntax to pass as many filenames to stat
as will fit in the environment. You may have to adjust the for
loop range based on your shell's integer size, or if you know how large the largest log file might be. This "option" has the "benefit" of being able to be POSIX-compliant if you replace the stat
call with a simple ls
.