Связанный ответ содержит полезную информацию, хотя вопрос несколько неоднозначен, и в ответах используются разные интерпретации.
Вероятно, самый простой подход в вашем случае (упрощенная версия https://stackoverflow.com/a/10448940/45375 ):
(GLOBIGNORE='*.a:*.b'; rm *.*)
- Обратите внимание на использование подоболочки (
(...)
) для локализации установки переменной GLOBIGNORE
.
- Шаблоны, назначенные
GLOBIGNORE
, должны быть разделены :
.
Привлекательность этого подхода заключается в том, что вы можете использовать одну подоболочку без изменения глобального состояния.
Напротив, использование одной подоболочки с помощью shopt -s extglob
требует некоторой хитрости:
(shopt -s extglob; glob='*.!(a|b)'; echo $glob)
Обратите внимание на обязательное использование промежуточной переменной, без которой команда сломалась бы (поскольку литерал подстановки был бы расширен ДО выполнения команд, и в этот момент расширенный синтаксис подстановки еще не распознан).
Предупреждение: использование GLOBIGNORE
имеет неожиданный побочный эффект (ошибка?):
Если для GLOBIGNORE
установлено любое значение, расширение имени пути *
и *.*
ведет себя так, как если бы действовала опция оболочки dotglob
, даже если это не так.
Другими словами: если GLOBIGNORE
установлен, скрытые файлы, не исключенные явным образом шаблоном в GLOBIGNORE
, всегда сопоставляются *
и *.*
.
dotglob
по умолчанию выключено, поэтому *
НЕ включает скрытые файлы (если GLOBIGNORE
не установлено, что по умолчанию верно).
Если вы также хотите исключить скрытые файлы при использовании GLOBIGNORE
, добавьте следующий шаблон: .*
; применительно к вопросу, вы получите:
(GLOBIGNORE='*.a:*.b:.*'; rm *.*)
Напротив, использование расширенного подстановки после включения параметра оболочки extglob
ДЕЙСТВИТЕЛЬНО учитывает параметр dotglob
.
person
mklement0
schedule
05.06.2014
shopt -u extglob
для отключения - person HattrickNZ   schedule 11.06.2014