97

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
  • 1
    cd into the directory and do an rm -Rf of all the files and directories in there. Commented May 4, 2011 at 7:39

14 Answers 14

72

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.

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

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 {} +
2
  • 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. Commented 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
    Commented Dec 8, 2015 at 11:36
22

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/*
    
2
  • 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... Commented Apr 8, 2017 at 13:52
  • 1
    EDIT: to do it safe, use rm -rf ./* ./.* Commented Apr 8, 2017 at 13:54
15

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.

6

Try this version:

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

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 '{}' \;
3

I am using find command here:

Step 1: Find all the files and delete them :

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

Example:

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 {} \;
1
  • 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. Commented Jan 31, 2017 at 11:48
1

Another option:

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

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

0

rm's syntax is:

rm [OPTION]... FILE...

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

rm -r sub_dir/
0

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.

0

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

From the directory that holds the images directory.

rm -frd ./images/*

before:

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

after:

images/
1
  • 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
    Commented May 16, 2016 at 1:09
0

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.

-2

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/*
0
-4

cd into the folder then execute the following command:

ls |xargs rm -rf
1
  • 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
    Commented May 26, 2015 at 0:04

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .