I am trying to remove all files and subdirectories in a directory. I used rm -r to remove all files, but I want to remove all files and subdirectories, excluding the top directory itself.

For example, I have a top directory like images. It contains the files header.png, footer.png and a subdirectory.

Now I want to delete header.png, footer.png and the subdirectory, but not images.

How can I do this in linux?

  • 1
    cd into the directory and do an rm -Rf of all the files and directories in there. May 4, 2011 at 7:39

14 Answers 14


If your top-level directory is called images, then run rm -r images/*. This uses the shell glob operator * to run rm -r on every file or directory within images.

  • 37
    hidden file will not be deleted.
    – reto
    Aug 19, 2013 at 17:58

To delete hidden files, you have to specify:

rm -r images/* images/.*

With shells whose globs include . and .., this will lead to an error like

rm: cannot remove `.' directory `images/.'
rm: cannot remove `..' directory `images/..'

but it will delete hidden files.

An approach without errormessage is to use find/delete with mindepth. This is gnu-find.

find images -mindepth 1 -delete

Your find may lack the -mindepth or -delete predicate, in which case, you could do:

find images/. ! -name . -prune -exec rm -rf {} +
  • My suggestion was to use 'rm -r images/.*' which would match 'images/..' but not 'images/../..'. The recursion can't go upwards, since 'images/../images/..' is again the same directory. May 26, 2015 at 4:39
  • 5
    @DarkHeart rm .* doesn't delete . or .. and hasn't since at least 1994 for the GNU utils and likely since the late 70s for UNIX. It is extremely unlikely you'll find a system where rm .* traverses the filesystem upwards outside of a museum.
    – terdon
    Dec 8, 2015 at 11:36

To delete all files and directories(including the hidden ones) in a directory, you can try the following:

  • use ls -Ab to match all files/directories

    cd dir_name && rm -rf `ls -Ab`
  • use find to match all files/directories

    find dir_name -mindepth 1 -delete

    or, if your find doesn't support -delete:

    find dir_name -mindepth 1 -exec rm -rf {}
  • delete the folder, then recreate it

    rm -rf dir_name && mkdir dir_name
  • in bash,

    shopt -s dotglob  
    rm -rf dir_name/*
  • Note that command like rm -rf * is not safe if you have no knowledge of files in a directory, because a file starting with - (hyphen) will be interpreted as rm flag... Apr 8, 2017 at 13:52
  • 1
    EDIT: to do it safe, use rm -rf ./* ./.* Apr 8, 2017 at 13:54

To delete all regular files recursively inside a directory, this command (assuming GNU or FreeBSD find) is good enough:

find . -type f -delete

That leaves all the non-regular files like symlinks (whether they point to regular files or not), directories, fifos, sockets, devices...

See also:

find . ! -type d -delete

to delete files of any type except directory.


Try this version:

 rm -r test/*
  • 1
    This won't remove hidden files (ones starting with ".").
    – gbmhunter
    Mar 4, 2015 at 22:59

I am using find command here:

Step 1: Find all the files and delete them :

find /path/to/directory/ -type f -exec rm {} \;


find /home/user/Desktop/images/ -type f -exec rm {} \;

Step 2: Find all the sub-directories and delete them :

find /path/to/directory/ -type d -exec rm -R {} \;
  • find /path/to/directory/ -type d includes . so will delete the directory itself. You need to also use the -mindepth switch as others have said. Jan 31, 2017 at 11:48

The question was to empty a directory = remove contents of a directory including hidden files, but not the directory itself. The find command with -mindepth 1 is actually the correct way to go, but to avoid error messages it must be joined with -maxdepth 1:

find /path/to/dir -mindepth 1 -maxdepth 1 -exec rm -rf '{}' \;

Another option:

$ rm -rf /path/to/directory/{*,.*}

source: https://askubuntu.com/a/552834/56648


rm's syntax is:

rm [OPTION]... FILE...

So, you have to state the appropriate path explicitly, e.g.

rm -r sub_dir/

You can remove directory using following command:

sudo rm -r directoryname1/2/3/*

It will be delete entire directory after 3/*.

Example sudo rm -r Downloads/song/*

It will be delete all files which are within Downloads/song.


This works perfectly for me, tested several variations worked every time.

From the directory that holds the images directory.

rm -frd ./images/*


    |_ header.png
    |_ footer.png
    |_ subdir/


  • Not sure it was made clear in the original question, but just to point out that unless you enable dotglob, this will skip any "dot-file" or dot-directory under images (mkdir images/.somedir; touch images/.somefile)
    – Jeff Schaller
    May 16, 2016 at 1:09

To delete all files and subdirectories in the current directory, including hidden ones, without error message:

rm -rf .[^.] .??* *

Or, from the parent directory:

rm -rf images/.[^.] images/.??* images/*

From https://serverfault.com/a/47940/269538.


Delete the folder "test" and all the files inside:

 rm -r test

Delete all the files inside but keep the folder "test":

 rm -r test/*

cd into the folder then execute the following command:

ls |xargs rm -rf
  • 2
    This will fail in on filenames that contain whitespace. I would recommend against using the output of ls as input to other commands, it is generally unsafe.
    – dhag
    May 26, 2015 at 0:04

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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