#1 Le 30/11/2009, à 22: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, à 22:53)
Hors ligne
#2 Le 30/11/2009, à 22: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, à 22:50)
GUL Bordeaux : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne
#3 Le 30/11/2009, à 22: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.
Par curiosité, à quoi sert le <<< dans ta commande ?
Dernière modification par abelthorne (Le 30/11/2009, à 22:54)
Hors ligne
#4 Le 30/11/2009, à 23: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 : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne
#5 Le 30/11/2009, à 23: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 30/11/2009, à 23:53)
Hors ligne
#6 Le 01/12/2009, à 00: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 : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne
#7 Le 01/12/2009, à 00: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 ?
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, à 00:31)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#8 Le 01/12/2009, à 02: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, à 02:39)
Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script (Hors ligne)
Hors ligne
#9 Le 01/12/2009, à 09: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
@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 : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne
#10 Le 01/12/2009, à 09: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.
Hors ligne
#11 Le 01/12/2009, à 10: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
Avec case tu peux mettre plusieurs commandes à la suite séparées par des ; la fin des commandes est indiquée par ;;
GUL Bordeaux : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne
#12 Le 01/12/2009, à 10: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.
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, à 11: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 : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne
#14 Le 01/12/2009, à 11:27
- abelthorne
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
Et dans le cas d'un nom qui aurait plusieurs points ? mon.fichier.texte.txt par exemple ?
Hors ligne
#15 Le 01/12/2009, à 12:06
- AnsuzPeorth
Re : Une action en fonction de l'extension d'un fichier ?
@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 (Hors ligne)
Hors ligne
#16 Le 01/12/2009, à 16:50
- Hizoka
Re : Une action en fonction de l'extension d'un fichier ?
fais le test
i="mon.fichier.texte.txt"
echo ${i##*.}
Pour confirmer un peu ce que dis ansuz : http://forum.ubuntu-fr.org/viewtopic.php?id=359256
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne