How do I remove all *.foo in a directory tree?
rm -r *.foo
does not work.
I could try a loop, but that needs recursive expansion:
for x in */*/.../*.foo
do rm $x
done
Which is not possible either.
How do I remove all *.foo in a directory tree?
rm -r *.foo
does not work.
I could try a loop, but that needs recursive expansion:
for x in */*/.../*.foo
do rm $x
done
Which is not possible either.
You can use find:
find -name '*.foo' -delete
-exec action that can be used for that purpose.
– cYrus
Dec 24 '13 at 11:25
. when I didn't need all this time! I'll save like, 20 seconds in the rest of my life now!
– Rob
Dec 27 '13 at 20:23
Assuming you have a fairly recent version of bash:
shopt -s globstar
rm -- **/*.foo
One of the easiest solutions would be to use the find command with the exec parameter:
find /path/where/to/start/search -type f -name "*.foo" -exec rm {} \;
This will look for all files named *.foo and perform rm {filename} for each one.
If you have lots of files, use of the xargs command may be faster:
find /path/where/to/start/search -type f -name "*.foo" | xargs rm
This will find all files, and will put the file names behind the rm command up until the max length of a command your distro/shell will support, so when run it'll to this:
rm dir1/file1.foo dir1/file2.foo dir1/file3.foo
As you can imagine now the rm binary needs to be started much less, making this a faster option.
| xargs with -print0 | xargs -0. By default, xargs splits its input on any whitespace, which could produce unwanted results if any file or directory names had spaces in them. The extra switches make find and xmarks use null bytes, which are not allowed in filenames, as separators instead.
– Ilmari Karonen
Dec 23 '13 at 13:49
xargs or -exec is more universal.
– mtak
Dec 24 '13 at 11:29
chowninstead ofrm. – Ilmari Karonen Dec 23 '13 at 13:46