Forum des développeurs  

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é.
Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Linux > Applications > Shell

Shell Vos questions sur l'utilisation des commandes shell

Réponse
 
Outils de la discussion
Vieux 17/11/2008, 21h35   #16 (permalink)
Membre Confirmé
 
Date d'inscription: décembre 2006
Localisation: Près de La Rochelle
Messages: 220
Par défaut

Salut,

Citation:
86400 = 24 * 60 * 60
CQFD
__________________
Winnt

C'est en Linuxant qu'on devient .... geek
Winnt est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 18/11/2008, 00h01   #17 (permalink)
Membre Confirmé
 
Date d'inscription: septembre 2007
Localisation: Genève
Âge: 45
Messages: 272
Par défaut

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).
jmelyn est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 18/11/2008, 16h05   #18 (permalink)
Invité régulier
 
Date d'inscription: novembre 2008
Localisation: Annecy
Âge: 30
Messages: 10
Par défaut

ok ! Merci pour les explications !
74manu74 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 18/11/2008, 23h01   #19 (permalink)
Invité régulier
 
Date d'inscription: novembre 2008
Localisation: Annecy
Âge: 30
Messages: 10
Par défaut

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
Ma question : Est-ce que j'ai le droit d'appeler une variable dans une commande telle que : mv

Dernière modification par ggnore ; 19/11/2008 à 15h46
74manu74 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 19/11/2008, 15h38   #20 (permalink)
Membre Confirmé
 
Date d'inscription: septembre 2007
Localisation: Genève
Âge: 45
Messages: 272
Par défaut

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
jmelyn est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 19/11/2008, 17h28   #21 (permalink)
Invité régulier
 
Date d'inscription: novembre 2008
Localisation: Annecy
Âge: 30
Messages: 10
Par défaut

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
74manu74 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 19/11/2008, 19h43   #22 (permalink)
Membre Confirmé
 
Date d'inscription: septembre 2007
Localisation: Genève
Âge: 45
Messages: 272
Par défaut

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
Explications:
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.
jmelyn est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 19/11/2008, 22h00   #23 (permalink)
Invité régulier
 
Date d'inscription: novembre 2008
Localisation: Annecy
Âge: 30
Messages: 10
Par défaut

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
74manu74 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 20/11/2008, 17h28   #24 (permalink)
Membre Confirmé
 
Date d'inscription: septembre 2007
Localisation: Genève
Âge: 45
Messages: 272
Par défaut

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.
jmelyn est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 22/11/2008, 23h27   #25 (permalink)
Invité régulier
 
Date d'inscription: novembre 2008
Localisation: Annecy
Âge: 30
Messages: 10
Par défaut

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

74manu74 est déconnecté   Envoyer un message privé Réponse avec citation
NEWS LINUX PROFESSIONNELFAQ LINUXTUTORIELS LINUXLIVRES LINUXLINUX TVUNIXGTK+QtAPACHE

Réponse

Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Linux > Applications > Shell



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non
Navigation rapide