![]() |
| Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé. | |||||||
|
|||||||
| Shell Vos questions sur l'utilisation des commandes shell |
![]() |
|
|
Outils de la discussion |
|
|
#17 (permalink) |
|
Membre Confirmé
![]() Date d'inscription: septembre 2007
Localisation: Genève
Âge: 45
Messages: 272
|
Bonsoir,
J'ai essayé de nommer les variables pour comprendre leur utilité, même si c'est en anglais (plus court, en général, que le français): dateSec: nombre de secondes depuis Epoch jusqu'à la date nowSec: nombre de secondes jusqu'à maintenant diffDay: différence (entre les deux dates), comptée en nombre de jours La commande awk est est monde à elle toute seule. Quelques explications sur le code: Option -F: elle détermine comment chaque ligne du fichier sera découpée en mot. D'habitude c'est l'espace qui délimite les mots, mais ici j'ai choisi le tiret '-'. Les simples guillemets sont inutiles, ils montrent mieux le caractère que j'ai choisi (question de style). Donc, awk coupe la première ligne en mots, travaille dessus selon le programme qu'on lui a fourni, puis passe à la ligne suivante pour faire le même travail (dans la version simple), jusqu'à ce que le fichier soit entièrement parcouru. Afin de travailler sur les mots, il est nécessaire de les nommer. C'est le rôle des $i: $1 est le premier mot de la ligne, $2 le second, etc. $0 est particulier, c'est la ligne entière. Il existe des fonctions à l'intérieur de awk, comme mktime() qui traduit une date format humain (AAAA MM JJ HH MM SS) en format ordi (nombre de secondes depuis Epoch, c'est-à-dire le 1er janvier 1970). J'ai mis 12 qui est le nombre d'heures pour être en milieu de journée et pas inquiété par les changements d'horaires été - hiver. 86400 secondes = 1440 minutes = 24 heures = 1 jour. Il est des valeurs bonnes à connaître. Comme le nombre de secondes depuis Epoch: ce sera 1 milliard 230 millions un peu avant Noël (1 milliard de secondes, ça fait quasiment 32 années). |
|
|
|
|
|
#19 (permalink) |
|
Invité régulier
![]() Date d'inscription: novembre 2008
Localisation: Annecy
Âge: 30
Messages: 10
|
J'ai encore une petite question :
Je souhaite mettre en variable un ls un peu special. (et mettre tout ce qui n'a pas l'extension .doc dans le repertoire soft. J'ai donc fait : Code :
mkdir /mon/repertoire/jour/reference/soft cd /mon/repertoire/jour/reference variable=ls | grep -v [.doc]$ mv $variable /mon/repertoire/jour/reference/soft Dernière modification par ggnore ; 19/11/2008 à 15h46 |
|
|
|
|
|
#20 (permalink) |
|
Membre Confirmé
![]() Date d'inscription: septembre 2007
Localisation: Genève
Âge: 45
Messages: 272
|
Oui, parfaitement, les variables sont faites pour cela. Mais voici ce que je ferais, sans aucune variable puisque c'est simple.
Code :
cd /mon/repertoire/jour/reference mkdir -p soft mv $(ls | grep -v .doc$) soft |
|
|
|
|
|
#21 (permalink) |
|
Invité régulier
![]() Date d'inscription: novembre 2008
Localisation: Annecy
Âge: 30
Messages: 10
|
Merci pour ton aide
Cependant ; il y a un p'tit souci : on copie le dossier soft dans le dossier soft cree precedemment. Par ailleurs, je souhaite savoir si en utilisant mes variables ; le code est bon ? Code :
cd /var/www/test2/12-10-2008 mkdir soft variable=`ls | grep -v [.doc]$` mv $variable /var/www/test2/12-10-2008/soft |
|
|
|
|
|
#22 (permalink) |
|
Membre Confirmé
![]() Date d'inscription: septembre 2007
Localisation: Genève
Âge: 45
Messages: 272
|
Oops, tu as raison, il y a de la récursivité dans l'air. Il faut donc supprimer aussi le répertoire cible de la liste de fichiers à transférer. Donc on corrige, tout de suite!
Code :
cd /var/www/test2/12-10-2008 mkdir -p soft mv !(*.doc|soft) soft mkdir -p soft: l'option -p permet de ne pas avoir d'erreur si le répertoire est déjà présent. Je peux donc relancer la commande si je n'y arrive pas du premier coup (habituel pour moi). !(*.doc|soft): c'est le shell qui va lui-même sélectionner tous les fichiers sauf ( '!(...)' ) les fichiers se terminant par .doc ou ( '|' ) se nommant soft. Je n'ai pas testé l'ensemble des trois commandes, mais j'espère que c'est correct. Au fait, s'il y a un répertoire, il risque d'y avoir une erreur. Pour ton code, il est faux pour deux raisons. C'est toi-même qui a donné la première: récursivité de la commande mv. La seconde est l'utilisation des crochets. Si tu fais un man bash, tu verras au chapitre pattern matching (j'ai tout en anglais) à quoi servent les crochets. |
|
|
|
|
|
#23 (permalink) |
|
Invité régulier
![]() Date d'inscription: novembre 2008
Localisation: Annecy
Âge: 30
Messages: 10
|
Il y a un probleme de syntaxe sur la ligne mv.
Pourtant, en utilisant les [] je n'ai pas d'erreurs dans mon code. Là où je rencontre une dificulté ; c'est d'exclure des fichiers et des repertoires. Voici mon code, et je prefere utiliser mon systeme de variable, je trouve ce principe plus ordonné. Ce qui est mis en commentaire (les dossiers) ne fonctionne pas ; je cherche à exclure l'envoi du sous-dossier Volta dans le dossier general reference Code :
cd /mnt/backup/manu/jour/12-11-2008/reference mkdir -p soft fichiers=`ls | grep -v [.doc.pdf]$` # dossiers=`ls | grep [Volta]` mv $fichiers /mnt/backup/manu/jour/12-11-2008/reference/soft # mv $dossiers /mnt/backup/manu/jour/12-11-2008/reference/soft |
|
|
|
|
|
#24 (permalink) |
|
Membre Confirmé
![]() Date d'inscription: septembre 2007
Localisation: Genève
Âge: 45
Messages: 272
|
Si tu prenais le temps de lire la doc, comme je te le demande, tu saurais que le shell interprète [.doc]$ comme un filtre utilisé ici sur la liste des fichiers: tous les fichiers se terminant par . ou par d ou par o ou par c sont sélectionnés. Donc les fichiers doc sont sélectionnés uniquement parce qu'il y a [c]$. Mais le fichier toto.c serait également sélectionné.
Définir une variable pour ne l'utiliser qu'une seule fois alourdit le code, selon moi. Pour la commande mv, n'oublie pas que tu es déjà dans le répertoire reference, vu la commande cd quelques lignes au-dessus. Donc mv $fichiers soft est plus concis et lisible. Enfin, mv !(*.doc|soft) soft fonctionne correctement sur Bash. |
|
|
|
|
|
#25 (permalink) |
|
Invité régulier
![]() Date d'inscription: novembre 2008
Localisation: Annecy
Âge: 30
Messages: 10
|
J'ai maintenant relu le man, et tu as raison que les crochets cherchent les caractères renseignés.
J'ai changé quelques points sur mon script et il fonctionne à présent parfaitement bien. Je vous remercie et particulièrement jmelyn
|
|
|
|
|
![]() |
![]() |
||
Aide de demarrage sur un script perso
|
||
| Outils de la discussion | |
|
|