≡ Menu

Linux / Unix: Find and Delete All Empty Directories & Files

How do I find out all empty files and directories on a Linux / Apple OS X / BSD / Unix-like operating systems and delete them in a single pass?

You need to use the combination of find and rm command. GNU/find has an option to delete files with -delete option. Please note that Unix / Linux filenames can contain blanks and newlines, this default behaviour is often problematic; filenames containing blanks and/or newlines are incorrectly processed by many utilities including rm command. To avoid problems you need to pass the -print0 option to find command and pass the -0 option to xargs command, which prevents such problems.

WARNING! These examples may crash your computer if executed. Some background process (daemons) may use empty files as a lock files or as default location to lock (chroot) down daemons. Do not delete those files. Usually, located in /var/, /lib/ and other important locations.

Method # 1: Find and delete everything with find command only

The syntax is as follows to find and delete all empty directories using BSD or GNU find command:

find /path/to/dir -empty -type d -delete

Find and delete all empty files:

find /path/to/dir -empty -type f -delete

Delete empty directories

In this example, delete empty directories from ~/Downloads/

find ~/Downloads/ -empty -type d -delete

Delete empty files

In this example, delete empty files from ~/Downloads/

find ~/Downloads/ -empty -type -f -delete

Sample session:

Fig.01: Delete empty directories and files.

Fig.01: Delete empty directories and files.

How to count all empty files or directories?

The syntax is as follows:

## count empty dirs only ##
find /path/ -empty -type d | wc -l
 
## count empty files only ##
find /path/ -empty -type f | wc -l

Where,

  • -empty : Only find empty files and make sure it is a regular file or a directory.
  • -type d : Only match directories.
  • -type f : Only match files.
  • -delete : Delete files. Always put -delete option at the end of find command as find command line is evaluated as an expression, so putting -delete first will make find try to delete everything below the starting points you specified.

This is useful when you need to clean up empty directories and files in a single command.

Method # 2: Find and delete everything using xargs and rm/rmdir command

The syntax is as follows to find and delete all empty directories using xargs command:

## secure and fast version ###
find /path/to/dir/ -type d -empty -print0 | xargs -0 -I {} /bin/rmdir "{}"

OR

## secure but may be slow due to -exec  ##
find /path/to/dir -type d -empty -print0 -exec rmdir -v "{}" \;

The syntax is as follows to delete all empty files:

## secure and fast version ###
find /path/to/dir/ -type f -empty -print0 | xargs -0 -I {} /bin/rm "{}"

OR

## secure but may be slow due to -exec  ##
find . -type f -empty -print0 -exec rm -v "{}" \;

See man pages – find(1), rmdir(1), xargs(1)

Share this tutorial on:

Your support makes a big difference:
I have a small favor to ask. More people are reading the nixCraft. Many of you block advertising which is your right, and advertising revenues are not sufficient to cover my operating costs. So you can see why I need to ask for your help. The nixCraft, takes a lot of my time and hard work to produce. If you use nixCraft, who likes it, helps me with donations:
Become a Supporter →    Make a contribution via Paypal/Bitcoin →   

Don't Miss Any Linux and Unix Tips

Get nixCraft in your inbox. It's free:



{ 11 comments… add one }
  • Scott Carlson October 25, 2012, 12:26 pm

    my pruneEmptyDirs script looks like :

    perl -MFile::Find -e”finddepth(sub{rmdir},’.’)”

  • Balakrishnan B October 25, 2012, 5:47 pm

    zsh only
    To delete all empty directories

    1. rmdir –ignore-fail-on-non-empty **/*(/)
    2. rmdir **/*(/^F)
  • AngelVG October 11, 2013, 3:42 pm

    Take care:

    If you have the directory /home/ftp/pub
    empty, the command

    find /home/ftp/pub -type d -empty -exec rm {} ;

    deleted the pub directory (i tested this in FreeBSD 9.1)

    The solution:

    add the option
    -depth 1

    example

    find /home/ftp/pub -depth 1 -type d -empty -exec rm {} ;

    For example, for maintain my ftp directory clear (up to 7 days), y have this lines in script /usr/home/backups/scripts/script-del-old.sh with this

    #! /bin/sh

    # Files
    find /usr/home/ftp/pub -atime +1w -exec rm {} ;
    echo
    # Directories
    find /usr/home/ftp/pub -depth 1 -type d -empty -atime +1w -exec rm {} ;

    Executions permissions
    # chmod +x /usr/home/backups/scripts/script-del-old.sh

    and in my cron add

    00 01 * * * root /usr/home/backups/scripts/script-del-old.sh

    This is all, bye.

    • Allen Cohen January 15, 2015, 10:28 pm

      No such syntax: “-atime +1w”
      Must use: “-atime +7”

      Also there’s “-amin …” for minutes ago

      I prefer to use the modification times rather than access times.

  • AngelVG November 1, 2013, 4:29 pm

    Hi, some correction…

    For example, for maintain my ftp directory clear (up to 7 days)
    the correct command is

    # Files
    find /usr/home/invitadoftp/pub -type f -mtime +1w -exec rm {} ;
    # Direcories
    find /usr/home/invitadoftp/pub -depth 1 -type d -empty -mtime +1w -exec rm {} ;

    Please update may older command and delete this

  • uniqueinx July 17, 2014, 12:14 pm

    nice one ;)

  • Anderson Figueiredo August 22, 2014, 11:24 am

    Very good… thanks!

  • Ryan T January 2, 2015, 7:30 pm

    For Delete empty directories you need ‘-type d’ not ‘-type -d’. Same with the file removal example.

    find ~/Downloads/ -empty -type d -delete
    find ~/Downloads/ -empty -type f -delete

  • Allan Nila Chongwe October 1, 2015, 8:09 am

    When deleting empty files, the above example will not work. For example if you execute the command ‘find ~/Downloads/ -empty -type -f -delete’ you will get the following error message; find: Arguments to -type should contain only one letter. The solution is to remove the minus (-) in front of the f option. Thus the correct command should be ‘find ~/Downloads/ -empty -type f -delete’ without the quotes (‘) ofcourse.

  • anthony February 3, 2016, 1:23 am

    What you must realise is that not all UNIX machines has the latest and greatest find!

    Solaris for example uses a very old version (no -empty or -delete).

    Here is one that finds OR finds and removes empty directories on either solaris or linux

    find “$dir” -depth -type d |
    while read sub; do
    # case “$sub” in */*) ;; *) continue ;; esac # sub-dir only
    [ “`cd “$sub”; echo .* * ?`” = “. .. * ?” ] || continue
    echo rmdir “$sub”
    #rmdir “$sub”
    done

Security: Are you a robot or human?

Leave a Comment

You can use these HTML tags and attributes: <strong> <em> <pre> <code> <a href="" title="">


   Tagged with: , , , ,