Что ж, если исключение определенных шаблонов имен файлов должно выполняться каждой файловой утилитой unix-ish (например, cp, mv, rm, tar, rsync, scp, ...), произойдет огромное дублирование усилий.Вместо этого такие вещи могут быть выполнены как часть globbing , то есть с помощью вашей оболочки.
bash
Ссылка на руководство, поиск extglob .
Пример:
$ shopt -s extglob
$ echo images/*
images/004.bmp images/033.jpg images/1276338351183.jpg images/2252.png
$ echo images/!(*.jpg)
images/004.bmp images/2252.png
Таким образом, вы просто помещаете шаблон внутрь !()
, и это сводит на нет совпадение.Шаблон может быть сколь угодно сложным, начиная от перечисления отдельных путей (как Ванварил показывает в другом ответе): !(filename1|path2|etc3)
, до вещей, похожих на регулярные выражения со звездами и классами персонажей.Подробнее см. На странице справки.
zsh
Ссылка на руководство, раздел «генерация имени файла» .
Вы можетесделать setopt KSH_GLOB
и использовать шаблоны, похожие на bash.Или
% setopt EXTENDED_GLOB
% echo images/*
images/004.bmp images/033.jpg images/1276338351183.jpg images/2252.png
% echo images/*~*.jpg
images/004.bmp images/2252.png
Итак x~y
соответствует шаблону x
, но исключает шаблон y
.Еще раз, для полной информации обратитесь к man-странице.
fish new!
Оболочка fish имеет гораздо более симпатичный ответ на этот вопрос:
? cp (string match -v '*.excluded.names' -- srcdir/*) destdir
Бонусный совет
Тип cp *
, нажатие Ctrl X * и просто посмотрим, что получится. это не вредно Обещаю