Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

is it possible to use rm to remove files and directories matching a pattern recursively without using other commands?

share|improve this question

5 Answers 5

up vote 30 down vote accepted

To directly answer your question, "no - you can't do what you describe with rm".

You can, however, do it you combine it with find. Here's one of many ways you could do that:

 # search for everything in this tree, search for the file pattern, pipe to rm
 find . | grep <pattern> | xargs rm

For example, if you want to nuke all *~ files, you could so this:

 # the $ anchors the grep search to the last character on the line
 find . -type f | grep '~'$ | xargs rm

To expand from a comment*:

 # this will handle spaces of funky characters in file names
 find -type f -name '*~' -print0 | xargs -0 rm
share|improve this answer
1  
true - if you leave-out the last pipe, you'll get a list of everything first :) –  warren Oct 27 '09 at 5:48
2  
May not directly answer the poster's question, but is the closest they will get to what they want. –  Drakia Oct 27 '09 at 16:35
1  
A Dwarf, isn't that a little bit bitter for no reason ? –  Gnoupi Oct 27 '09 at 16:53
10  
Please be very careful using find | grep | xargs rm. If there are files with spaces (or newlines), this will break (and depending on the filenames and where the spaces are) might delete stuff that you did not intend to delete. find … -print0 | xargs -0 rm will be much more robust. It will mean, however that you cannot use grep and must use find's predicates to match and print0 only the desired files. warren's second example will be more robust as find -type f -name '*~' -print0 | xargs -0 rm. –  Chris Johnsen Oct 28 '09 at 5:20
1  
If you want a single command to do the job, make an alias using one of the find commands given. Will fill in an answer for this later, if desired. –  casualuser Nov 7 '09 at 18:09

"without using other commands"

No.

share|improve this answer
    
Nice answer illustrating the "strictly answer the initial question (at the risk of not being able to provide a solution)" vs. "provide a solution, even if it's not strictly matching to imposed restrictions" debate. –  Gnoupi Oct 27 '09 at 16:59
    
I only posted this as "A Dwarf" was complaining about the answer that actually provided a solution. Without using other commands there really is no way to do recursive file deletion that matches a pattern, just current-directory file/directory deletion. –  Drakia Oct 27 '09 at 18:29

I would have asuumed " rm -rf " where is a combination of file names, and matching patterns such as * and ? etc (eg todays_log_2009????.log) . That will start from current Dir and work down recursively removing files that macth that pattern.

share|improve this answer
    
This won't work because the pattern is expanded by the shell in the current directory. If quoted, the pattern becomes a filename with special characters in it. e.g. to delete the file [, one could write rm '[' . The pattern simply loses its meaning. –  casualuser Nov 7 '09 at 18:02

Using Bash, with globstar set, yes:

rm basedir/**/my*pattern*

Try it with e.g. ls -1 first, before rm to list the files you match.

You set options through e.g. shopt -s globstar.


Alternatively, a shorter find variant:

find -type f -name 'my*pattern*' -delete

or for GNU find:

find -type f -name 'my*pattern*' -exec rm {} +

or another alternative for non-GNU find (a bit slower):

find -type f -name 'my*pattern*' -exec rm {} \;

To also remove directories, as you ask for: just change rm into rm -r in the above commands and skip matching on only -type f in the find commands.

share|improve this answer

If you use zsh(1), turn on "extended globbing" with setopt extendedglob in .zshrc. Prefixing the pattern with '**/' will then delete recursively:

% rm -rf **/< pattern >

However, if there are a lot of files to delete you should resort to find(1) with xargs(1) or -exec, and I also recommend doing that in shell scripts.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.