Lorsque j'utilise le code ci-dessous dans un 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 je lance le script Shell à partir du terminal, une erreur se produit:
script clean.sh:
#!/bin/bash
rm !(*.sh) -rf
L'erreur que je reçois:
./clean.sh: line 2: syntax error near unexpected token `('
./clean.sh: line 2: `rm !(*.sh) -rf'
pouvez-vous aider?
rm !(*.sh)
est une syntaxe extglob
qui signifie supprimer tous les fichiers, sauf ceux portant l'extension .sh
.
Dans votre instance interactive bash
name__, l'option Shell extglob
est activée:
$ shopt extglob
extglob on
Maintenant que votre script est exécuté dans un sous-shell, vous devez activer extglob
en l'ajoutant au début du script:
shopt -s extglob
Donc, votre script ressemble à:
#!/bin/bash
shopt -s extglob
rm -rf -- !(*.sh)
EDIT:
Pour supprimer tous les fichiers sauf ceux de l'extension .sh
, utilisez GLOBIGNORE
(car vous ne voulez pas activer extglob
name__):
#!/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
Ok, c'est un post-cross, mais je dois écrire une réponse. ;)
Vous pouvez utiliser find
à la place
find . -maxdepth 1 ! -name '*.sh' -exec rm -rf {} \;
Vous devez activer extglob
:
shopt -s extglob