At the moment his is what I do:
Step 1:
locate fooBar
/home/abc/fooBar
/home/abc/Music/fooBar
Step 2:
Manually perform a removal, by copy-pasting each line.
rm /home/abc/fooBar
rm /home/abc/Music/fooBar
How do I do this in one step? Something like
locate fooBar > rm
Thanks.
As the other chaps have already mentioned, xargs is your friend. It's a really powerful tool and I'll try to explain it and provide a workaround for a common gotcha.
What xargs does is take a line from the input, and append it to another command, executing that other command for every line in the input. So by typing
locate foobar | xargs rm -f
, the output of the locate command will be patched onto the end of therm -f
command, and executed for each line produced bylocate foobar
.The gotcha:
But what if there are spaces in your line(s) returned by locate? That will break the
rm -f
command because the arguments passed to rm need to be files (unless you use the -r switch), and a file-path needs to be escaped or quoted if it contains spaces.xargs provides the -i switch, to substitute the input into the command that follows instead of just appending it. So I'd change the suggestion to
which will now only break if the filenames returned by locate contained apostrophes.
I have to concur with qbi, that you should be careful about using rm -f ! Use the -p flag to xargs, or just run the locate foobar by itself before feeding it to xargs, or drop the -f from rm.
You maybe need some more options for use with
xargs
. Test it first withxargs -p
. If it is OK, remove the-p
option:To delete all the files that are returned by locate,issue the following command in your terminal
locate foobar | xargs rm -f