Erreur de syntaxe près du jeton inattendu `('

11

Lorsque j'utilise le code ci-dessous dans le terminal Ubuntu, cela fonctionne bien:

rm !(*.sh) -rf

Mais si je place le même code de ligne dans un script shell (clean.sh) et que j'exécute le script shell à partir du terminal, cela génère une erreur:

script clean.sh:

#!/bin/bash
rm !(*.sh) -rf

L'erreur que j'obtiens:

./clean.sh: line 2: syntax error near unexpected token `('
./clean.sh: line 2: `rm !(*.sh) -rf'

pouvez-vous aider?

Tal
la source

Réponses:

23

rm !(*.sh)est une extglobsyntaxe qui signifie supprimer tous les fichiers sauf ceux qui ont l' .shextension.

Dans votre bashinstance interactive , l'option shell extglobest activée :

$ shopt extglob 
extglob         on

Maintenant que votre script s'exécute dans un sous-shell, vous devez l'activer extgloben l'ajoutant au début du script:

shopt -s extglob

Votre script ressemble donc à:

#!/bin/bash
shopt -s extglob
rm -rf -- !(*.sh)

ÉDITER :

Pour supprimer tous les fichiers sauf .shceux utilisés par l'extension GLOBIGNORE(car vous ne voulez pas l'activer extglob):

#!/bin/bash
GLOBIGNORE='*.sh'
rm -rf *

Exemple :

$ ls -1
barbar
bar.sh
egg
foo.sh
spam

$ GLOBIGNORE='*.sh'

$ rm *

$ ls -1
bar.sh
foo.sh
heemayl
la source
puis-je changer ma commande qui fait la même chose sans exécuter cela? shopt -s extglob?
Tal
@Tal vérifier mes modifications ..
heemayl
1
merci :) (overflaw de pile me fait écrire 15 caractères dans le commentaire :( :( :()
Tal
mais ici il y a deux bonnes réponses!
Tal
1
Cela devrait être la réponse acceptée, car elle répond en fait à la question, tandis que l'autre décrit simplement une solution de contournement.
Guntram Blohm prend en charge Monica
4

Ok, c'est un cross-post, mais je dois écrire une réponse. ;)

Vous pouvez utiliser à la findplace

find . -maxdepth 1 ! -name '*.sh' -exec rm -rf {} \;
UN B
la source
2

Vous devez activer extglob:

shopt -s extglob
choroba
la source
1
@ Pilot6: Voir man bash. Il permet un globbing étendu comme !(...).
choroba
puis-je changer ma commande qui fait la même chose sans exécuter cela? shopt -s extglob
Tal