Когда я использую код ниже в терминале Ubuntu, он работает нормально:
rm !(*.sh) -rf
Но если я помещаю тот же строчный код в скрипт оболочки (clean.sh) и запускаю скрипт оболочки из терминала, он выдаст ошибку:
скрипт clean.sh:
#!/bin/bash
rm !(*.sh) -rf
Я получаю ошибку:
./clean.sh: line 2: syntax error near unexpected token `('
./clean.sh: line 2: `rm !(*.sh) -rf'
вы можете помочь?
Ответы:
rm !(*.sh)
этоextglob
синтаксис, который означает удалить все файлы, кроме тех, которые имеют.sh
расширение.В вашем интерактивном
bash
экземпляре опция оболочки включенаextglob
:Теперь, когда ваш скрипт выполняется в подоболочке, вам нужно включить
extglob
его, добавив в начале скрипта:Итак, ваш скрипт выглядит так:
РЕДАКТИРОВАТЬ :
Чтобы удалить все файлы, кроме
.sh
расширенных, используйтеGLOBIGNORE
(поскольку вы не хотите включатьextglob
):Пример :
источник
shopt -s extglob
?Хорошо, это кросс-пост, но я должен написать ответ. ;)
Вы могли бы использовать
find
вместоисточник
Вам необходимо включить
extglob
:источник
man bash
. Это позволяет расширенное сглаживание как!(...)
.shopt -s extglob