Find and delete all the directories named "test" in linux
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 \0
characters instead of newlines; and -0
tells xargs
to treat only \0
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.)
find /path/to/dir -name "test" -type d -delete
-name: looks for the name passed. You can use
-regex
for providing names based on regular expressions-type: looks for file types.
d
only looks for directories-delete: action which deletes the list found.
Alternatively:
find /path/to/dir -name "test" -type d -exec rm -rf {} \;
As J.F. Sebastian stated in the comments:
You could use +
instead of \;
to pass more than one directory at a time.
yet another way to do this is
find . -name test -exec rm -R "{}" \;
A helpfull link on find : http://www.softpanorama.info/Tools/Find/using_exec_option_and_xargs_in_find.shtml