16

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.

  • 1
    An empty file, is a file with no characters? (could be spaces, linebreaks and tabs)? – Jacob Vlijm Jan 11 '16 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. – user364819 Jan 11 '16 at 19:24
24

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.

  • Sorry, I missed something out, please look at the edited version of my question. It shouldn't be too much to add. – user364819 Jan 11 '16 at 19:27
9

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

  • And will this recursively list sub-folders and their contents as well? – user364819 Jan 11 '16 at 18:56
  • this will recursively show empty files and folders – EdiD Jan 11 '16 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. – user364819 Jan 11 '16 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 '16 at 18:25
  • @kos - probably graph instead alnum will do the job – EdiD Jan 13 '16 at 18:48

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.