удалять файлы, когда имя НЕ содержит слов - PullRequest
7 голосов
/ 03 июля 2011

Я использую Linux и намереваюсь удалить некоторые файлы с помощью оболочки.

У меня есть некоторые файлы в моей папке, некоторые имена файлов содержат слово «хорошо», другие нет.Например:

ssgood.wmv
ssbad.wmv
goodboy.wmv
cuteboy.wmv

Я хочу удалить файлы, которые НЕ содержат «хорошего» в имени, поэтому оставшиеся файлы:

ssgood.wmv
goodboy.wmv

Как это сделать с помощью rm в оболочке?Я пытаюсь использовать

rm -f *[!good].*

, но это не работает.

Большое спасибо!

Ответы [ 3 ]

17 голосов
/ 03 июля 2011

Эта команда должна делать то, что вам нужно:

ls -1 | grep -v 'good' | xargs rm -f

Вероятно, он будет работать быстрее, чем другие команды, поскольку он не предполагает использования регулярных выражений (что является медленным и ненужным для такой простой операции).

6 голосов
/ 03 июля 2011

С bash вы можете получить "отрицательное" соответствие с помощью опции оболочки extglob:

shopt -s extglob
rm !(*good*)
4 голосов
/ 03 июля 2011

Вы можете использовать find с оператором -not:

find . -not -iname "*good*" -a -not -name "." -exec rm {} \;

Я использовал -exec для вызова rm, но IИнтересно, если find имеет встроенное действие удаления, оно есть, см. ниже .

Но очень осторожно с этим,Обратите внимание, что в приведенном выше тексте я должен был вставить предложение -a -not -name ".", потому что в противном случае оно совпадало с ., текущим каталогом.Так что я бы тщательно проверил с -print, прежде чем вставить -exec rm {} \; бит!

Обновление : Да, я никогда не использовал его, но действительно есть -deleteдействие.Итак:

find . -not -iname "*good*" -a -not -name "." -delete

Опять же, будьте осторожны и перепроверьте, что вы не соответствуете больше, чем вы хотите сопоставить первым.

...