46

How can I list (using ls) all files that are not empty (size > 0) using linux?

Nifle
  • 34,203
  • 26
  • 108
  • 137
David B
  • 2,454
  • 7
  • 27
  • 33

7 Answers7

65

I'd use find dirname -not -empty -ls, assuming GNU find.

Daenyth
  • 6,290
  • 2
  • 28
  • 22
  • 1
    Anyone care to explain the downvote? – Daenyth Sep 24 '10 at 15:48
  • Probably because the asker asked for `ls` and you used `find` ;) I upped though... It's a proper solution – Pylsa Oct 03 '10 at 10:10
  • 3
    If you use "find . -not -empty -ls" it will also include the current directory (ie "." in it's output), to just include the current files use "find . -type f -not -empty -ls" – user672009 Oct 10 '16 at 07:34
21

This is a job for find ls is not powerful enough.

find -maxdepth 1 -size +0 -print

-maxdepth 1 - this tells find to search the current dir only, remove to look in all sub dirs or change the number to go down 2, 3 or more levels.

-size +0 this tells find to look for files with size larger than 0 bytes. 0 can be changed to any size you would want.

-print tells find to print out the full path to the file it finds

Edit:
Late addition: You should probably also add the -type f switch above. This tells find to only find files. And as noted in comments below, the -print switch is not really needed.

Nifle
  • 34,203
  • 26
  • 108
  • 137
  • 1
    To avoid a warning you should place `-maxdepth 1` before `-size +0`. Also `-print` is the default action, so it's not needed. – cYrus Sep 23 '10 at 13:46
  • @cYrus - No warnings for me (cygwin) – Nifle Sep 23 '10 at 16:02
  • Implementations of `find` vary a lot in terms of what valid options are and where they can go. GNU `find` (which is awfully common) *will* produce a warning if you put `-size` before `-maxdepth`. – Telemachus Oct 02 '10 at 21:12
14
ls -l | awk '{if ($5 != 0) print $9}'

If you are intent on using ls, you need a little help from awk.

MaQleod
  • 13,149
  • 4
  • 40
  • 61
10

find dirname -type f ! -empty

Joril
  • 2,020
  • 1
  • 26
  • 33
9

Ls has almost no option to filter files: that's not its job. Filtering files is the job of the shell for simple cases (through globbing) and the job of find for complex cases.

In zsh, you can the L globbing qualifier to retain only files whose size is >0 (the . qualifier restricts to regular files):

ls *(.L+0)

Users of other shells must use find. With GNU find (as found mostly on Linux):

find -maxdepth 1 -type f ! -empty -exec ls {} +

A POSIX-compliant way is:

find . -type f -size +0c -exec ls {} + -o -name . -o -prune

If ls wasn't just an example and you merely intend visual inspection, you could sort by size: ls -S.

Gilles 'SO- stop being evil'
  • 69,786
  • 21
  • 137
  • 178
3
 $ find /* -type f ! -size 0

will work better if you want all non empty files, rather than just directories.

Telemachus
  • 6,845
  • 1
  • 27
  • 33
Trezoid
  • 752
  • 4
  • 7
2

Bash 4.0+

shopt -s globstar
shopt -s nullglob
for file in **/*; do  test -f "$file" && [[ -s "$file" ]] && echo "$file"; done
user31894
  • 2,789
  • 18
  • 9