Опция extglob
оболочки дает более мощный поиск по шаблону в командной строке.
Включите его с помощью shopt -s extglob
и выключите его с помощью shopt -u extglob
.
В вашем примере, вы бы сначала сделать:
$ shopt -s extglob
$ cp !(*Music*) /target_directory
Полный доступный внутр закончился Глоб операторы Бинг являются (выдержка из man bash
):
Если опция extglob оболочки разрешено с использованием встроенного магазина, признано несколько расширенных операторов сопоставления шаблонов. В следующем описании, pat tern-list представляет собой список из одного или нескольких шаблонов, разделенных символом |. Композитные структуры могут быть сформированы с использованием одного или более из следующих подшаблонов:
- ?(Шаблон)
соответствует нулю или одно вхождение указанных шаблонов
- * (шаблон)
Соответствует нулю или более вхождений указанных шаблонов
- + (шаблон)
Соответствует одному или более вхождений указанных шаблонов
- @ (шаблон)
Матчи один из заданных шаблонов
- ! (Шаблон)
Матчи ничего, кроме одного из указанных шаблонов
Так, например, если вы хотите, чтобы получить список всех файлов в текущем каталоге, которые не .c
или .h
файлы, вы могли бы сделать:
$ ls -d !(*@(.c|.h))
конечно, нормальные оболочки globing работы, поэтому последний пример можно записать в виде:
$ ls -d !(*.[ch])
Это рекурсивная копия, которая отличается поведением. Он также генерирует новый процесс для каждого файла, который может быть очень неэффективным для большого количества файлов. – 2008-10-19 21:25:47
Стоимость нереста процесса равна нулю по сравнению со всеми IO, которые генерируют копирование каждого файла. Поэтому я бы сказал, что это достаточно хорошо для случайного использования. – dland 2008-10-19 21:29:23
Некоторые обходные пути для процесса нереста: http://stackoverflow.com/questions/186099/how-do-you-handle-the-too-many-files-problem-when-working-in-bash – 2008-10-19 21:34:18