Errore di sintassi vicino al token imprevisto `('


11

Quando uso il codice seguente nel terminale Ubuntu, funziona benissimo:

rm !(*.sh) -rf

Ma se inserisco lo stesso codice di linea in uno script di shell (clean.sh) ed eseguo lo script di shell dal terminale, viene generato un errore:

script clean.sh:

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

L'errore che ottengo:

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

Puoi aiutare?


Risposte:


23

rm !(*.sh)è una extglobsintassi che significa rimuovere tutti i file tranne quelli che hanno l' .shestensione.

Nell'istanza interattiva bash, l'opzione shell extglobè attiva:

$ shopt extglob 
extglob         on

Ora che lo script è in esecuzione in una subshell, è necessario abilitarlo extglobaggiungendolo all'inizio dello script:

shopt -s extglob

Quindi la tua sceneggiatura è simile a:

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

MODIFICARE :

Per rimuovere tutti i file tranne .shquelli utilizzati dall'estensione GLOBIGNORE(poiché non si desidera abilitare extglob):

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

Esempio :

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

$ GLOBIGNORE='*.sh'

$ rm *

$ ls -1
bar.sh
foo.sh

posso cambiare il mio comando che fa lo stesso senza eseguire questo? shopt -s extglob?
Tal

@Tal controlla le mie modifiche ..
heemayl

1
grazie :) (lo stack overflaw mi fa scrivere 15 caratteri nel commento :( :( :()
Tal

ma qui ci sono due buone risposte!
Tal

1
Questa dovrebbe essere la risposta accettata, poiché in realtà risponde alla domanda, mentre l'altra descrive solo una soluzione alternativa.
Guntram Blohm supporta Monica il

4

Ok, è un cross-post, ma devo scrivere una risposta. ;)

findInvece potresti usare

find . -maxdepth 1 ! -name '*.sh' -exec rm -rf {} \;

2

Devi attivare extglob:

shopt -s extglob

1
@ Pilot6: vedi man bash. Esso consente il globbing esteso come !(...).
Choroba,

posso cambiare il mio comando che fa lo stesso senza eseguire questo? shopt -s extglob
Tal
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.