How to simply remove everything from a directory on Linux
How to simply remove everything from a current or specified directory on Linux?
Several approaches:
rm -fr *
rm -fr dirname/*
Does not work — it will leave hidden files — the one's that start with a dot, and files starting with a dash in current dir, and will not work with too many filesrm -fr -- *
rm -fr -- dirname/*
Does not work — it will leave hidden files and will not work with too many filesrm -fr -- * .*
rm -fr -- dirname/* dirname/.*
Don't try this — it will also remove a parent directory, because ".." also starts with a "."rm -fr * .??*
rm -fr dirname/* dirname/.??*
Does not work — it will leave files like ".a", ".b" etc., and will not work with too many filesfind -mindepth 1 -maxdepth 1 -print0 | xargs -0 rm -fr
find dirname -mindepth 1 -maxdepth 1 -print0 | xargs -0 rm -fr
As far as I know correct but not simple.find -delete
find dirname -delete
AFAIK correct for current directory, but used with specified directory will delete that directory also.find -mindepth 1 -delete
find dirname -mindeph 1 -delete
AFAIK correct, but is it the simplest way?
rm -fr * .*
Will work fine with at least GNU rm as it has special code to exclude "." and ".."
$ id
uid=65534(nobody) gid=65534(nogroup) groups=65534(nogroup)
$ cd /tmp
$ mkdir rmtest
$ cd rmtest
$ touch .test
$ ls -la
total 8
drwxr-xr-x 2 nobody nogroup 4096 2009-08-19 15:37 .
drwxrwxrwt 7 root root 4096 2009-08-19 15:37 ..
-rw-r--r-- 1 nobody nogroup 0 2009-08-19 15:37 .test
$ rm -rf .*
rm: cannot remove `.' or `..'
rm: cannot remove `.' or `..'
$ ls -la
total 8
drwxr-xr-x 2 nobody nogroup 4096 2009-08-19 15:37 .
drwxrwxrwt 7 root root 4096 2009-08-19 15:37 ..
$
http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/remove.c#n440
FreeBSD rm man page says "It is an error to attempt to remove the files /, . or ..", so it probably works there too if you specify the force flag to ignore the error.
http://www.freebsd.org/cgi/man.cgi?query=rm&apropos=0&sektion=0&manpath=FreeBSD+7.2-RELEASE&format=html
To add to your list, lets say you want to delete everything in the directory foo and all sub directories (that is what your find command does). I always found the simplest was:
#for dir foo with /home/kbrandt/foo
rm -rf /home/kbrandt/foo && mkdir /home/kbrandt/foo
If you don't want to delete the sub directories, modify your find command to include -type f
rm -rf directory
It'll effectively nuke everything, including the directory itself.
Why not a simple
ls -la <selected dir>| xargs rm -Rf
?
It will generate errors for "." & ".." but it will drop everything else.