Как удалить определенные файлы в текущем каталоге, которые не соответствуют заданному шаблону? - PullRequest
2 голосов
/ 24 ноября 2010

, используя rm *.sh для удаления файлов, заканчивающихся на .sh, легко и понятно. Но как мне удалить все файлы в текущем каталоге, которые не заканчиваются на .jar что-то вроде rm * -except *.jar

Ответы [ 3 ]

6 голосов
/ 24 ноября 2010

Попробуйте это:

find . -mindepth 1 -maxdepth 1 ! -name '*.jar' | sort

Если вы действительно хотите удалить все файлы на выходе, просто выполните

find . -mindepth 1 -maxdepth 1 ! -name '*.jar' -delete

Вы можете прочитать страницу руководства find (1) для получения дополнительной информации об этом действительно мощном инструменте.

EDIT:

Поскольку флаг -delete встречается только в GNU find> 4.2.3 (как указано в SiegeX), вот несколько альтернатив, которые также гарантируют, что мы не пытаемся удалить каталоги:

find . -mindepth 1 -maxdepth 1 ! -type d ! -name '*.jar' -print0 | xargs -0 -r rm -f

Флаги -r xargs - это расширение GNU, поэтому оно немного более переносимо (работает на * BSD), но не так чисто:

find . -mindepth 1 -maxdepth 1 ! -type d ! -name '*.jar' -print0 | xargs -0 rm -f

В качестве последнего, но наиболее портативного - курорта:

find . -mindepth 1 -maxdepth 1 ! -type d ! -name '*.jar' -exec rm '{}' ';'

Недостатком этого является вызов rm отдельно для каждого файла, что делает его значительно медленнее.

1 голос
/ 24 ноября 2010

Вы можете сделать это, включив опцию расширенного glob extglob, а затем поместив свой шаблон в !(), например:

shopt -s extglob;
rm !(*.jar)

Обратите внимание, что extglob также дает вам следующее:

  • ?() - Совпадение с нулем или одним шаблоном
  • *() - Совпадение с нулем или несколькими шаблоном
  • @() - Совпадение точноодин из паттернов
  • !() - сопоставить все, кроме паттерна
1 голос
/ 24 ноября 2010
echo $(ls | grep -v '.jar$')

rm $(ls | grep -v '.jar$')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...