Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".

#1 Le 30/11/2009, à 23:36

abelthorne

Une action en fonction de l'extension d'un fichier ?

Bonsoir,
Encore une question pour un script bash.

Dans un dossier, j'ai des fichiers en vrac. J'aimerais lister son contenu dans un script et, en fonction de l'extension des fichiers, réaliser une action ou une autre.

#!/bin/bash
for i in `ls mondossier`
do
  if [ `echo "$i" | awk -F . '{print $NF}'` = "ini" ]; then
    # action pour les .ini
  else
    # action pour les autres
  fi
done

Bien sûr, ça ne marche pas. Comment faire mon test pour vérifier l'extension des fichiers ?

EDIT : ça a l'air de marcher avec ce nouveau code.

Dernière modification par abelthorne (Le 30/11/2009, à 23:53)

Hors ligne

#2 Le 30/11/2009, à 23:49

nesthib

Re : Une action en fonction de l'extension d'un fichier ?

y'a beaucoup mieux mais pour te donner une piste

for i in `ls folder`
do
  if grep -q '.txt$' <<<$i
  then
    echo "match $i"
  fi
done

tu peux remplacer les if par des case
tu peux également utiliser find avec l'option --exec si tu n'as qu'une ou deux extensions à tester

Dernière modification par nesthib (Le 30/11/2009, à 23:50)


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdnGMT-4

Hors ligne

#3 Le 30/11/2009, à 23:53

abelthorne

Re : Une action en fonction de l'extension d'un fichier ?

J'ai modifié mon message au même moment avec une commande qui a l'air de marcher. smile

Par curiosité, à quoi sert le <<< dans ta commande ?

Dernière modification par abelthorne (Le 30/11/2009, à 23:54)

Hors ligne

#4 Le 01/12/2009, à 00:06

nesthib

Re : Une action en fonction de l'extension d'un fichier ?

ça redirige le contenu de la variable vers grep

avec ton [ `echo "$i" | awk -F . '{print $NF}'` = "ini" ] tu as un process pour [], un pour `` (sous-shell), un pour echo, un pour | (sous-shell), un pour awk

avec grep -q '.txt$' <<<$i, la redirection n'ouvre pas de nouveau sous-shell (à ma connaissance) et pas besoin de test car le if prend le code de retour de grep qui est 0 si grep trouve ce qu'il veut (succès) et 1 sinon (échec). Au final un seul nouveau process, le grep
Après en cherchant un peu il y a peut être encore mieux


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdnGMT-4

Hors ligne

#5 Le 01/12/2009, à 00:52

abelthorne

Re : Une action en fonction de l'extension d'un fichier ?

Ok. Si je veux tester deux extensions (.ini et .log) en même temps, est-ce qu'il faut que je fasse

if grep -q '.ini$' || grep -q '.log$' <<<$i

ou

if grep -q '.ini$' <<<$i || grep -q '.log$' <<<$i

? ou encore autre chose ? (Je n'ai plus du tout l'habitude de faire des scripts bash.)

Dernière modification par abelthorne (Le 01/12/2009, à 00:53)

Hors ligne

#6 Le 01/12/2009, à 01:23

nesthib

Re : Une action en fonction de l'extension d'un fichier ?

grep -q -e '\.\(ini\|log\)$' <<<$i

-e pour activer les expressions rationnelles (alors il faut changer 2-3 trucs : \. pour un point sinon . = n'importe quel caractère, \| pour l'opérateur OR et \( \) pour entourer les alternatives du OR)


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdnGMT-4

Hors ligne

#7 Le 01/12/2009, à 01:28

Hizoka

Re : Une action en fonction de l'extension d'un fichier ?

for i in *
do
case "${i##*.}" in
txt) echo "c'est un txt" ;;
doc|ods) echo "c'est un doc ou un ods" ;;
*)  echo "c'est autre chose" ;;
esac
done

c'est assez propre non ? smile

EDIT : modif de la ligne 5

Apres tu peux ajouter des vérifications, genre vérifier si c'est un dossier par ex avant de traiter..

Dernière modification par Hizoka (Le 01/12/2009, à 01:31)

Hors ligne

#8 Le 01/12/2009, à 03:39

AnsuzPeorth

Re : Une action en fonction de l'extension d'un fichier ?

Si tu as bcp de fichier à traiter, les ER sont plus lourde que la comparaison bash.
Tu pourrais faire comme ça (une possibilité parmis tant d'autres):

#! /bin/bash
while read ligne
do
[[ "$ligne" =~ \.txt ]] || [[ "$ligne" =~ \.sh ]] && echo "le fichier $ligne correspond"
done < <(ls /home/user/truc)
exit

Pour mettre plusieurs commande facilement si correspondance:

#! /bin/bash
while read ligne
do
[[ "$ligne" =~ \.txt ]] || [[ "$ligne" =~ \.sh ]] && {
echo "le fichier $ligne correspond"
autres commandes
}

done < <(ls /home/user/truc)
exit

Dernière modification par AnsuzPeorth (Le 01/12/2009, à 03:39)


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (En ligne)

Hors ligne

#9 Le 01/12/2009, à 10:09

nesthib

Re : Une action en fonction de l'extension d'un fichier ?

@Hizoka : nickel, je pensais à un truc du genre! Il faudra que je me mette tous les opérateurs de substitution de texte dans les variables en tête wink

@AnsuzPeorth : corrige moi si je dis une bêtise mais =~ n'est-il pas un opérateur de comparaison d'expressions régulières?


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdnGMT-4

Hors ligne

#10 Le 01/12/2009, à 10:46

abelthorne

Re : Une action en fonction de l'extension d'un fichier ?

Ouh là, ça commence à se compliquer tout ça. Mon script est juste un lanceur un peu spécial, il n'a pas besoin d'être optimisé à tout prix. lol

Hors ligne

#11 Le 01/12/2009, à 11:11

nesthib

Re : Une action en fonction de l'extension d'un fichier ?

dans ce cas prends la solution d'Hizoka, c'est la plus claire à relire si tu te replonges dans ton code dans plusieurs semaines wink
Avec case tu peux mettre plusieurs commandes à la suite séparées par des ; la fin des commandes est indiquée par ;;


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdnGMT-4

Hors ligne

#12 Le 01/12/2009, à 11:51

abelthorne

Re : Une action en fonction de l'extension d'un fichier ?

J'aimerais quand même des explications sur la solution d'Hizoka, vu que je n'aime pas taper des commandes que je ne comprends pas. wink

Il y a deux choses qui m'échappent :
- case "${i##*.}" in : que signifie "${i##*.}" ?
- pourquoi deux points-virgules à la fin de chaque cas ? Le premier termine la commande et le deuxième fait office de break ?

Hors ligne

#13 Le 01/12/2009, à 12:21

nesthib

Re : Une action en fonction de l'extension d'un fichier ?

${i##*.} supprime le motif le plus long de la variable i qui corresponde à *. (soit n'importe quoi suivi d'un point).
cela te vire donc tout ce qui est avant l'extension s'il y en a une. Attention si tu as un fichier nommé juste txt par exemple, ${i##*.} te retournera quand même txt (ce que ne fait pas ma solution ou celle d'AnsuzPeorth)

le double point-virgule sert à signifier la fin des commandes pour un motif donné de case et le passage au test suivant (exemple, en non gras les commentaires)
motif txt : txt) ma commande1 ; ma commande2 ; ma commande3 ;; ← fin des commandes on teste un autre motif
motif truc ou bidule : truc|bidule) ma commande4 ; ma commande5 ; ma commande6;;
autre motif : *) ma commande7 ;;


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdnGMT-4

Hors ligne

#14 Le 01/12/2009, à 12:27

abelthorne

Re : Une action en fonction de l'extension d'un fichier ?

nesthib a écrit :

${i##*.} supprime le motif le plus long de la variable i qui corresponde à *. (soit n'importe quoi suivi d'un point).
cela te vire donc tout ce qui est avant l'extension s'il y en a une. Attention si tu as un fichier nommé juste txt par exemple, ${i##*.} te retournera quand même txt

Et dans le cas d'un nom qui aurait plusieurs points ? mon.fichier.texte.txt par exemple ?

Hors ligne

#15 Le 01/12/2009, à 13:06

AnsuzPeorth

Re : Une action en fonction de l'extension d'un fichier ?

nesthib a écrit :

@AnsuzPeorth : corrige moi si je dis une bêtise mais =~ n'est-il pas un opérateur de comparaison d'expressions régulières?

réguliere, rationnel...j'm'y perds la dedans.
Fais des test sur un gros fichier, tu verras une énorme différence de temps d'execution entre l'utilisation de egrep ou du tild.


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (En ligne)

Hors ligne

#16 Le 01/12/2009, à 17:50

Hizoka

Re : Une action en fonction de l'extension d'un fichier ?

fais le test smile

i="mon.fichier.texte.txt"
echo ${i##*.}

Pour confirmer un peu ce que dis ansuz : http://forum.ubuntu-fr.org/viewtopic.php?id=359256

Hors ligne

Haut de page ↑