Can I find all files with the .log extension and order by file size?

49,389

Solution 1

This seems to work for me:

find .  -name \*.log -ls | sort -r -n -k7

Solution 2

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.

Share:
49,389

Related videos on Youtube

bigmike7801
Author by

bigmike7801

Updated on September 18, 2022

Comments

  • bigmike7801
    bigmike7801 over 1 year

    I'm using CentOS 6.8

    I'd like to know if I can I find all files with the .log extension and order by file size and display the file size next to the filename?

    I'm currently using this command to find all files with the .log extension:

    find .  -name \*.log
    
    • Jeff Schaller
      Jeff Schaller about 7 years
      If any of the existing answers solves your problem, please consider accepting it via the checkmark. Thank you!
  • bigmike7801
    bigmike7801 about 7 years
    Sorry, that didn't work.
  • don_crissti
    don_crissti about 7 years
  • Jeff Schaller
    Jeff Schaller about 7 years
    Thank you, Don! I developed the answer on a BSD system with a different stat command, and I didn't look closely enough at the online manpage for GNU stat. Always test!
  • Robert Strauch
    Robert Strauch almost 7 years
    Could you please explain the arguments?
  • AdminBee
    AdminBee over 2 years
    Welcome to the site, and thank you for your contribution. However, please note that your post seems to mostly reiterate what this other answer by @bigmike7801 already stated. If you want to add more details or context, please consider submitting an edit suggestion to that answer instead.