Shell – Find and delete all the directories named “test” in linux

I have many directories named “test” and I would like to remove them.

I know how to find them and print them using:

find . -name test -print

Now, how to do I remove the directories?


Please note that I have files in the directory as well and they must be removed as well.

Solution:

xargs does all the magic:

find . -name test -type d -print0|xargs -0 rm -r --

xargs executes the command passed as parameters, with the arguments passed to stdin.

This is using rm -r to delete the directory and all its children.

The -- denotes the end of the arguments, to avoid a path starting with - from being treated as an argument.

-print0 tells find to print characters instead of newlines; and -0 tells xargs to treat only as argument separator.

This is calling rm with many directories at once, avoiding the overhead of calling rm separately for each directory.


As an alternative, find can also run a command for each selected file:

find . -name test -type d -exec rm -r {} ;

And this one, with better performance, since it will call rm with multiple directories at once:

find . -name test -type d -exec rm -r {} +

(Note the + at the end; this one is equivalent to the xargs solution.)