17

I must remove 200 000 files (all of them) from a folder, and I don't want to delete the folder itself.

using rm, I get an "Argument list too long" error. I've tried to do something with xargs, but I'm not a Shell Guy, so it doesn't work:

find -name * | xargs rm -f
FMaz008
  • 429
  • 3
  • 12
  • 5
    Why don't delete the folder and recreate it after deletion? – garconcn Sep 27 '11 at 02:28
  • @garconcn Just reading this 9 years later. I don't remember why I had this problem in the first place, but I would guess either I didn't provide the full context to make the question readable, or... that's was a good idea. – FMaz008 Jan 01 '21 at 15:16

5 Answers5

36
$ find /path/to/folder -type f -delete
quanta
  • 50,327
  • 19
  • 152
  • 213
  • 15
    It's probably worth mentioning that GNU find (as used by most Linux distributions) can delete files on its own using `-delete`. This also avoids problems with files containing quotes or newline characters (though you could use GNU find's `-print0` and GNU xarg's `-0` options to fix that). – DerfK Sep 26 '11 at 16:22
  • 3
    @DerfK, nice remark! Also, lots of ppl tend to play with `xargs` meanwhile `find` has `-exec command {} +` syntax. – poige Sep 26 '11 at 17:16
5

You are doing everything right. It is the '*' that gives you a problem (the shell is expanding it into list of files instead of the find). The right syntax could be:

cd <your_directory>; find . -type f | xargs rm -f
find <your_directory> -type f | xargs rm -f

(The latter is a bit less efficient since it will pass longer names to xargs, but you will hardly notice :-) )

Alternatively, you could escape your '*' like this (however in that case it will also try also remove "." and ".."; it is not a biggie - you will just get a little warning :-) ):

find . -name '*' | xargs rm -f
find . -name "*" | xargs rm -f
find . -name \* | xargs rm -f

If your file names contain spaces then use this:

find . -type f -print0 | xargs -0 rm -f
dtoubelis
  • 4,579
  • 1
  • 28
  • 31
3

The following command will delete all files from the current directory:

find . -type f -exec rm {} \;
George Tasioulis
  • 1,969
  • 2
  • 16
  • 17
2

you can try

find /path/to/folder -type f -print0  | xargs -0 rm -f

or

find /path/to/folder -type f -exec rm -f "{}" +
user9517
  • 114,104
  • 20
  • 206
  • 289
1

Kudos to quantas answer, here are some additions.

If you like to delete files with a particular name pattern you can write it like this. Also added -print so you can see what's happening as the files are being deleted.

sudo find /home/mydirectory -name "*.jpg" -type f -print -delete

This for instance deletes all jpegs in mydirectory.

Waltur Buerk
  • 111
  • 2