Когда я использую ниже кода в терминале 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)
a extglob
синтаксис, что означает, удаляет все файлы кроме тех, которые имеют .sh
расширение.
В Вашем интерактивном bash
экземпляр, опция оболочки extglob
идет:
$ shopt extglob
extglob on
Теперь когда Ваш сценарий работает в подоболочке, необходимо включить extglob
путем добавления этого в начале сценария:
shopt -s extglob
Таким образом, Ваш сценарий похож:
#!/bin/bash
shopt -s extglob
rm -rf -- !(*.sh)
РЕДАКТИРОВАНИЕ:
Удалить все файлы кроме .sh
дополнительное использование GLOBIGNORE
(поскольку Вы не хотите включать extglob
) :
#!/bin/bash
GLOBIGNORE='*.sh'
rm -rf *
Пример:
$ ls -1
barbar
bar.sh
egg
foo.sh
spam
$ GLOBIGNORE='*.sh'
$ rm *
$ ls -1
bar.sh
foo.sh
Хорошо, это - кросспостинг, но я должен записать ответ. ;)
Вы могли использовать find
вместо этого
find . -maxdepth 1 ! -name '*.sh' -exec rm -rf {} \;
Необходимо повернуться extglob
на:
shopt -s extglob