How can I list (using ls
) all files that are not empty (size > 0) using linux?
7 Answers
I'd use find dirname -not -empty -ls
, assuming GNU find.
-
1
-
Probably because the asker asked for
ls
and you usedfind
;) I upped though... It's a proper solution– PylsaCommented Oct 3, 2010 at 10:10 -
3If 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" Commented Oct 10, 2016 at 7:34
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.
-
1To avoid a warning you should place
-maxdepth 1
before-size +0
. Also-print
is the default action, so it's not needed.– cYrusCommented Sep 23, 2010 at 13:46 -
-
Implementations of
find
vary a lot in terms of what valid options are and where they can go. GNUfind
(which is awfully common) will produce a warning if you put-size
before-maxdepth
. Commented Oct 2, 2010 at 21:12
ls -l | awk '{if ($5 != 0) print $9}'
If you are intent on using ls
, you need a little help from awk
.
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
.
$ find /* -type f ! -size 0
will work better if you want all non empty files, rather than just directories.
Bash 4.0+
shopt -s globstar
shopt -s nullglob
for file in **/*; do test -f "$file" && [[ -s "$file" ]] && echo "$file"; done