Ask Ubuntu is a question and answer site for Ubuntu users and developers. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

Let's say that in my folder ~/list I have a large amount of folders each with their own sub-folders and sub-sub-folders etc, and there are lots of files almost on each level. However some of these files and folders are empty, so how can I recursively search through them all to find the empty files and folders? And then have them displayed in a list of file locations so that I know where each one is (it should also be clear which is a file and which is a folder because not all files have file extensions). I am running Ubuntu GNOME 15.10 with GNOME 3.18.

Please note that it would also be very useful if it would also tell me if a file looked empty but wasn't (for instance if it had spaces or linebreaks in it or something). And would differentiate between a real empty file and one that just looks empty in the output.

share|improve this question
1  
An empty file, is a file with no characters? (could be spaces, linebreaks and tabs)? – Jacob Vlijm Jan 11 at 19:08
    
@JacobVlijm: Well, previously I was thinking just files which are 0 bytes, but now that you mention it, someone might have been crazy enough to give me a file with spaces or linebreaks or something, so I would like to detect those too, but I would like for the output to differentiate between an actual empty file, and one that just looks empty. – Paranoid Panda Jan 11 at 19:24
up vote 6 down vote accepted

From man find

    -empty File is empty and is either a regular file or a directory.

So to find both empty files and directories it is sufficient to do

find ~/lists -empty

To indicate the type, you could use the %y output format specifier

          %y     File's type (like in ls -l), U=unknown type (shouldn't happen)

e.g.

find ~/lists -empty -printf '%y %p\n'

or make use of an external program like ls, which includes a --classify option

    -F, --classify
          append indicator (one of */=>@|) to entries

i.e.

find ~/lists -empty -exec ls -Fd {} \;

If your definition of 'empty' is expanded to include files containing only whitespace characters, then it becomes more complicated - and more computationally intensive, since now you need to actually open at least any non-empty files and examine their contents. The most efficient way I can think of off the top of my head would be something like

find ~/list \( -empty -o \( -type f -a ! -exec grep -qm1 '[^[:blank:]]' {} \; \) \) -exec ls -Fd {} \;

(either empty, OR a file AND grep does not detect at least one non-blank character). Likely there is a better way though.

share|improve this answer
    
Sorry, I missed something out, please look at the edited version of my question. It shouldn't be too much to add. – Paranoid Panda Jan 11 at 19:27

From ~/list folder:

find . -empty -type d

for listing empty directories and

find . -empty -type f

for listing empty files.

find . -type f -exec bash -c 'if [ `cat "{}" |wc -w` -eq 0 ]; then echo "file - {}";fi' \; -or -empty -exec bash -c "echo dir - {}" \; 

for listing empty folders and files including whitespaces and empty lines

share|improve this answer
    
And will this recursively list sub-folders and their contents as well? – Paranoid Panda Jan 11 at 18:56
    
this will recursively show empty files and folders – EdiD Jan 11 at 18:57
    
Sorry, I missed something out, please look at the edited version of my question. It shouldn't be too much to add. – Paranoid Panda Jan 11 at 19:27
    
[ `grep -c [[:alnum:]] "{}"` -eq 0 ] will let through files containing only characters not in the [A-Za-z0-9] set. – kos Jan 13 at 18:25
    
@kos - probably graph instead alnum will do the job – EdiD Jan 13 at 18:48

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.