I am using Linux and intend to remove some files using shell.
I have some files in my folder, some filenames contain the word "good", others don't. For example:
ssgood.wmv
ssbad.wmv
goodboy.wmv
cuteboy.wmv
I want to remove the files that does NOT contain "good" in the name, so the remaining files are:
ssgood.wmv
goodboy.wmv
How to do that using rm
in shell? I try to use
rm -f *[!good].*
but it doesn't work.
Thanks a lot!
How do I remove or access a file with the name '-something' or containing another strange character ? If your file starts with a minus, use the -- flag to rm; if your file is named -g, then your rm command would look like rm -- -g.
Use the rm command to remove files you no longer need. The rm command removes the entries for a specified file, group of files, or certain select files from a list within a directory.
This command should do what you you need:
ls -1 | grep -v 'good' | xargs rm -f
It will probably run faster than other commands, since it does not involve the use of a regex (which is slow, and unnecessary for such a simple operation).
With bash, you can get "negative" matching via the extglob
shell option:
shopt -s extglob
rm !(*good*)
You can use find
with the -not
operator:
find . -not -iname "*good*" -a -not -name "." -exec rm {} \;
I've used -exec
to call rm
there, but I wonder if it does, see below.find
has a built-in delete action
But very careful with that. Note in the above I've had to put an -a -not -name "."
clause in, because otherwise it matched .
, the current directory. So I'd test thoroughly with -print
before putting in the -exec rm {} \;
bit!
Update: Yup, I've never used it, but there is indeed a -delete
action. So:
find . -not -iname "*good*" -a -not -name "." -delete
Again, be careful and double-check you're not matching more than you want to match first.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With