Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

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

share|improve this question
add comment

7 Answers

up vote 10 down vote accepted

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

share|improve this answer
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 –  BloodPhilia Oct 3 '10 at 10:10
add comment

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.

share|improve this answer
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 2 '10 at 21:12
    
@Tele - Good to know, thanks. –  Nifle Oct 2 '10 at 21:13
add comment

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.

share|improve this answer
add comment

find dirname -type f ! -empty

share|improve this answer
    
+1: more user friendly. But this way it prints not empty directories too, add: -type f. –  cYrus Sep 23 '10 at 14:10
    
Edited, thanks :) –  Joril Sep 23 '10 at 15:47
add comment
 $ find /* -type f ! -size 0

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

share|improve this answer
add comment
ls -l | awk '{if ($5 != 0) print $8}'

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

share|improve this answer
add comment

Bash 4.0+

shopt -s globstar
shopt -s nullglob
for file in **/*; do  test -f "$file" && [[ -s "$file" ]] && echo "$file"; done
share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.