Kiedy używam poniższego kodu w terminalu Ubuntu, działa dobrze:
rm !(*.sh) -rf
Ale jeśli umieszczę ten sam kod wiersza w skrypcie powłoki (clean.sh) i uruchomię skrypt powłoki z terminala, generuje błąd:
skrypt clean.sh:
#!/bin/bash
rm !(*.sh) -rf
Otrzymuję błąd:
./clean.sh: line 2: syntax error near unexpected token `('
./clean.sh: line 2: `rm !(*.sh) -rf'
możesz pomóc?
command-line
bash
scripts
rm
Tal
źródło
źródło
Odpowiedzi:
rm !(*.sh)
toextglob
składnia, która oznacza usunięcie wszystkich plików oprócz tych, które mają.sh
rozszerzenie.W interaktywnym
bash
wystąpieniu opcja powłokiextglob
jest włączona:Teraz, gdy skrypt działa w podpowłoce, musisz włączyć
extglob
, dodając to na początku skryptu:Twój skrypt wygląda więc tak:
EDYTOWAĆ :
Aby usunąć wszystkie pliki oprócz
.sh
tych rozszerzających, użyjGLOBIGNORE
(ponieważ nie chcesz włączaćextglob
):Przykład:
źródło
shopt -s extglob
?Ok, to jest cross-post, ale muszę napisać odpowiedź. ;)
Możesz
find
zamiast tego użyćźródło
Musisz włączyć
extglob
:źródło
man bash
. Umożliwia rozszerzone globowanie jak!(...)
.shopt -s extglob