Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 27/11/2008, à 16:24

/*_ßεn_*/

[Résolu] Problème d'execution avec `ls !()` en bash script

Bonjour à tous ! big_smile

Je bascule depuis peu, et petit à petit, de xp à ubuntu et j'adore cool ! Enfin bref, je m'essaye à écrire des scripts en bash et quelque chose me chiffonne :

Je souhaite par exemple lister tous les fichiers qui n'ont pas l'extension '.sh'. Dans mon cas particulier je veux utiliser 'rm' en fait. Le code suivant fonctionne correctement en console :

ls !(*.sh)

Or lorsque j'essaye de le lancer d'un script .sh, ça ne fonctionne plus. Je suis obligé de m'y prendre autrement, par exemple :

ls -A | egrep -v "*.sh"

Et donc pour effacer le tout :

ls -A | egrep -v "*.sh" | xargs rm -r

Savez-vous pourquoi ça bloque ? Voici mon code d'erreur :

Appuyez sur ENTRÉE ou tapez une commande pour continuer
./clean.sh: line 7: Erreur de syntaxe près du symbole inattendu « ( »
./clean.sh: line 7: `ls !(*.sh)'

le shell a retourné 2

Appuyez sur ENTRÉE ou tapez une commande pour continuer

Merci d'avance à ceux qui saurait m'éclairer !!

Dernière modification par /*_ßεn_*/ (Le 28/11/2008, à 16:04)

Hors ligne

#2 Le 27/11/2008, à 17:03

AnsuzPeorth

Re : [Résolu] Problème d'execution avec `ls !()` en bash script

Bjr,

tu as regardé du coté du man ?

ls nom/du/dossier --hide="*.sh"

#3 Le 27/11/2008, à 17:09

hazelno

Re : [Résolu] Problème d'execution avec `ls !()` en bash script

Salut

Je ne suis pas sur mais je pense que ta commande equivaut a celle ci

>rm -r !(*.sh)

Est ce que le but de tes commandes est de supprimer tout les fichiers qui ne sont pas des fichiers shells ?

Pourrais tu me donner plus d'informations s'il te plait?

#4 Le 27/11/2008, à 18:39

enguerran

Re : [Résolu] Problème d'execution avec `ls !()` en bash script

Pourrais-tu poster ton code ?


Ubuntu Lucid (qui fonctionne au poil ^^)

Hors ligne

#5 Le 27/11/2008, à 20:41

/*_ßεn_*/

Re : [Résolu] Problème d'execution avec `ls !()` en bash script

Oui hazelno, c'est exactement ce que j'essaye de faire ! Ça marche lancé en console mais pas en script !

AnsuzPeorth, merci de ta réponse mais je n'ai pas été assez précis :

En fait je souhaiterais tout simplement utiliser l'expression en script :

!(*nimportequoi*)

…avec nimporte quelle commande : echo, mv, cp, rm, etc.
Cela fonctionne correctement en ligne de commande, mais pas quand je l'invoque dans un script, ce que je n'arrive pas à comprendre !

Un autre exemple : je veux déplacer tous fichiers créés par le script, ou superflues, dans un dossier 'dossier_tmp', sauf les fichiers .sh

mkdir dossier_tmp
mv !(*.sh|dossier_tmp) dossier_tmp/

Ça me semble moins de travail que de passer par grep entre autre.

enguerran, voici le code de mon script pour l'instant (cf. étape 8) :

#!/bin/bash
# Un script pour rechercher et télécharger les vids flv d'une session en cours dans le browser epiphany

# 1) Changer de rep au cas où et récupérer la session en cours dans epiphany
cd $HOME/Documents/scripts/bash/dl
cp $HOME/.gnome2/epiphany/session_crashed.xml session_saved.xml

# 2) Extraire les adresse web de session_saved.xml et copier dans web_links
grep -o 'http.*\" ' session_saved.xml | sed -e 's/"//g' > web_links

# 3) Créer un dossier afin d'y stocker les 'squelettes' html
mkdir html_skel
cd html_skel

# 4)" Les télécharger un par un
wget -i $HOME/Documents/scripts/bash/dl/web_links

# 5) Trouver les références flv et copier dans vid_links
grep -o 'http.*.flv' * |sed -e s/^.*http/http/g > vid_links
sort vid_links | uniq > vid_links

# 6) Créer un dossier qui va acceuillir les d/l
mkdir $HOME/Documents/scripts/bash/dl/vids
cd $HOME/Documents/scripts/bash/dl/vids

# 7) Télécharger les vids à partir des liens extraits
wget -i $HOME/Documents/scripts/bash/dl/html_skel/vid_links

# 8) Effacer tous les fichiers obsoletes
rm -r !(*.sh|vids)

Merci à tous pour votre attention !

Hors ligne

#6 Le 27/11/2008, à 20:45

Totor

Re : [Résolu] Problème d'execution avec `ls !()` en bash script

Bonsoir,

Ton shell par défaut ne serait-il pas ksh ?
Utilises-tu un autre shell dans ton script (bash ou sh)
En effet, la syntaxe ls !(*.sh) est valable pour le ksh mais ne l'est pas pour le bash et le sh.
(Je n'ai pas cherché si elle l'était en modifiant une option. Alain.g apportera probablement une réponse à mon interrogation)

En tout cas, peux-tu poster le résultat de la commande suivante :

echo $SHELL

et si tu l'as définie, la valeur du shebang de ton script (ligne commençant par #!. Ex #!/bin/bash)

EDIT : tu as posté ton code alors que je rédigeais mon message.
Je constate effectivement que ton script utilise le bash.
Quid de $SHELL ?

Dernière modification par Totor (Le 27/11/2008, à 20:58)


-- Lucid Lynx --

Hors ligne

#7 Le 27/11/2008, à 21:01

/*_ßεn_*/

Re : [Résolu] Problème d'execution avec `ls !()` en bash script

Merci merci...
Oui la valeur renvoyée par

echo $SHELL

est bien /bin/bash
J'ai effectivement placé le shebang en début de fichier.

La chose étrange c'est que ça fonctionne dans le terminal mais pas en script hmm

Dernière modification par /*_ßεn_*/ (Le 27/11/2008, à 21:04)

Hors ligne

#8 Le 27/11/2008, à 22:06

Totor

Re : [Résolu] Problème d'execution avec `ls !()` en bash script

Bon, j'ai trouvé la solution.
En fait, ce que tu souhaites faire, c'est utiliser l'expansion des noms de fichiers étendue  (j'espère l'avoir traduit correctement wink) où il y a effectivement d'autres facilités de notation des noms de fichiers :

?(pattern-list)
   Matches zero or one occurrence of the given patterns
*(pattern-list)
   Matches zero or more occurrences of the given patterns
+(pattern-list)
   Matches one or more occurrences of the given patterns
@(pattern-list)
   Matches one of the given patterns
!(pattern-list)
   Matches anything except one of the given patterns

Mais pour cela, il te faut activer une option comportementale du shell via l'instruction shopt. Il s'agit de l'option extglob
Donc rajoute ceci en début de ton script et cela devrait fonctionner :

shopt -s extglob

Dans ton terminal, l'option doit déjà être active, ce qui expliquerait pourquoi ça fonctionne.
Pour le vérifier :

shopt -q extglob  && echo extglob actif || echo extglob non actif

enfin, pour désactiver l'option :

shopt -u extglob

-- Lucid Lynx --

Hors ligne

#9 Le 28/11/2008, à 16:02

/*_ßεn_*/

Re : [Résolu] Problème d'execution avec `ls !()` en bash script

Oui merci beaucoup Totor, c'etait exactement ça !!
J'ai vérifié avec la ligne shopt ... que tu m'as fourni, et c'etait bien activé par défaut (dans le terminal).

J'ai suivi ta recommandation et ajouté la commande shopt -s extglob en début de script et ça fonctionne nickel maintenant.

Je pensais que cette manière de filtrer etait standard...

Thanks again !! big_smile big_smile

Hors ligne