2014-01-14 3 views
4

При выполнении следующей команды:шаблон Глоб в Баш не признают «(»

rm -rf !(file1|file2) 

все файлы кроме file1 и file2 удаляются, как задумано Когда либо помещая эту команду в Баш. сценарий:

#!/bin/bash 
rm -rf !(file1|file2) 

или запустить его с помощью Баш -c:

bash -c "rm -rf !(file1|file2)" 

я получаю следующее сообщение об ошибке:

syntax error ner unexpected token '(' 

Я попытался установить параметры оболочки с помощью

shopt -s extglob 

yeilding в:

bash -c "shopt -s extglob; rm -rf !(file1|file2)" 

для включения Glob в соответствии с: https://superuser.com/questions/231718/remove-all-files-except-for-a-few-from-a-folder-in-unix и некоторые другие вопросы.

Все еще это не работает, и я нахожусь в убытке.

ответ

6

Прежде всего, для безопасности, давайте проведем наши испытания с echo !(file1|file2) вместо rm -rf !(file1|file2).

В любом случае, bash выполняет синтаксический анализ всей командной строки перед выполнением команды shopt -s extglob. Когда bash встречает (, опция extglob еще не установлена. Вот почему вы получаете ошибку.

Попробуйте вместо этого:

bash -O extglob -c 'echo !(file1|file2)' 

В вашем сценарии, вам просто нужно включить опцию в виде отдельной командной строки, прежде чем полагаться на него:

#!/bin/bash 
shopt -s extglob 
echo !(file1|file2) 

Вы действительно можете сделать это с помощью -c флаг также:

bash -c 'shopt -s extglob 
echo !(file1|file2)' 

Или даже так:

bash -c $'shopt -s extglob\necho !(file1|file2)' 
Смежные вопросы