|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Candidat au titre de Membre du Club
![]() Inscription : mai 2011 Messages : 54 ![]() |
Bonjour,
J'aurais besoin d'un petit peu d'aide car je dois réaliser un script shell. Cependant, je n'en ais jamais fait!! Ce script doit : - Copier un fichier dans un autre répertoire - Recopie celui-ci dans un autre fichier (nomFichier+date et heure de la copie) en supprimant les sauts de ligne - vide le fichier d'origine Voici ce que j'ai fait pour le moment : Code :
|
||
|
|
10
|
|
|
#2 |
|
Membre habitué
![]() Étudiant Inscription : août 2011 Messages : 46 ![]() |
Pour vider un fichier, une simple commande suffit :
|
|
|
00
|
|
|
#3 | |
|
Candidat au titre de Membre du Club
![]() Inscription : mai 2011 Messages : 54 ![]() |
Citation:
Et y a-t'il un moyen de vérifier que les actions faites avant de vider le fichier se sont bien déroulées? Car dans mon cas, si la copie a eu un problème, je ne dois pas vider le fichier! Et un autre petit problème je pense, la commande "sed" ne modifie pas le fichier mais affiche uniquement le résultat?! Comment faire pour que le fichier soit modifié ? |
|
|
|
10
|
|
|
#4 |
|
Membre Expert
![]() Ingénieur développement logiciels Inscription : octobre 2008 Messages : 1 375 ![]() |
1) Il ne faut pas d'espace autour du = pour les affectations
2) Pour récupérer la sortie d'une commande, c'est `command` et pas 'command' 3) Pour récupérer la valeur d'une variable, il faut mettre un $ : $FICHIER_ORIGINAL et pas FICHIER_ORIGINAL 4) sed ne vas pas modifier le fichier que tu passes en argument. Il se contente de le lire, de faire le traitement demandé, et d'envoyer le texte modifié sur sa sortie standard. Pour modifier un fichier il faut soit que tu utilises le flag -i (qui n'est pas standard), soit que tu lises un fichier et que tu rediriges la sortie dans un autre fichier (sed '...' input_file > output_file). 5) Ton expression sed n'est pas correcte. Utilises plutôt tr (tr '\n' ' ' < input_file > output_file) |
|
|
00
|
|
|
#5 | ||
|
Candidat au titre de Membre du Club
![]() Inscription : mai 2011 Messages : 54 ![]() |
Merci pour toutes ces infos!
Je viens de modifier mon shell : Code :
Si il y a un problème lors du traitement de la copie ou autre est-ce que le echo sera tout de même exécuté ou pas ? Et au niveau de la commande sed étant donné que je veux modifier le fichier est-ce possible de diriger la sortie du sed vers le fichier d'origine afin qu'il écrase ou pas ? |
||
|
|
10
|
|
|
#6 |
|
Membre Expert
![]() Ingénieur développement logiciels Inscription : octobre 2008 Messages : 1 375 ![]() |
Ton cp a l'air bon.
Non, tu ne peux pas modifier le fichier que tu es en train de lire. Dans ton cas puisque tu as de toute façon besoin de copier le fichier, je te suggère de faire les traitements donc tu as besoin pendant la copie, avec par exemple : Code :
/usr/bin/tr '\n' '' < $FICHIER_ORIGINAL > $FICHIER_RECOPIE |
|
|
00
|
|
|
#7 |
|
Candidat au titre de Membre du Club
![]() Inscription : mai 2011 Messages : 54 ![]() |
Merci pour ton info.
J'ai encore un problème, quand je prends le fichier que je veux traiter sous notepad, en fin de ligne je vois les caractères de saut de ligne : CR LF Dans mon code j'ai essayer d'enlever \n et aussi \r\n. Cependant, les sauts de ligne sont toujours présents ! Code :
/usr/bin/tr '\r\n' '' < $FICHIER_ORIGINAL > /apps/webservers/dev3/getex/params/creSave/fichier_creMIB-$DATE_DU_JOUR-$HEURE_DU_JOUR |
|
|
00
|
|
|
#8 | ||
|
Expert Confirmé Sénior
![]() Frédéric Ingénieur développement logiciels Inscription : février 2006 Messages : 3 055 ![]() |
Salut
En fait, on peut utiliser une astuce pour lire et modifier un même fichier sans passer par un fichier intermédiaire. Il faut pour cela passer par les canaux numérotés. On crée un canal numéroté correspondant au fichier à traiter puis on lit ce canal et on redirige le travail dans le fichier à traiter. Exemple: Code bash :
Le rm est toutefois obligatoire afin de dissocier, dans le SDF, l'ancien fichier du nouveau fichier. Si on ne le fait pas, la redirection commencera par vider l'ancien fichier. Et le canal n° 3 relié à ce fichier ne contiendra plus rien. C'est donc une procédure "sans filet" (en cas d'interruption malencontreuse du processus, perte totale du fichier quoi). Mis à part ce soucis, aucun pb. J'ai pu gérer de cette façon des fichiers allant jusqu'au G sans perte. Le système tient la charge...
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche. Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit. Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant. Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation. Dr. Adrian Rogers, 1931 |
||
|
|
00
|
|
|
#9 |
|
Membre Expert
![]() Ingénieur développement logiciels Inscription : octobre 2008 Messages : 1 375 ![]() |
C'est pratique en effet, mais dans ce cas on n'écrit justement pas dans le fichier qu'on est en train de lire. On écrit dans un nouveau fichier (nouvel inode), qui a le même nom que le fichier qu'on vient d'effacer (mais qui existe toujours sous l'inode original, jusqu'à ce qu'on ferme le fd 3).
|
|
|
00
|
|
|
#10 |
|
Candidat au titre de Membre du Club
![]() Inscription : mai 2011 Messages : 54 ![]() |
Merci à tous pour votre aide.
En tout cas mon problème est résolu par la commande suivante pour supprimer les saut de ligne : Code :
tr -d '\n' < $FICHIER_ORIGINAL > $FICHIER_RECOPIE |
|
|
00
|
|
|
#11 | ||||
|
Expert Confirmé Sénior
![]() Frédéric Ingénieur développement logiciels Inscription : février 2006 Messages : 3 055 ![]() |
Citation:
Toutefois, j'ai aussi une astuce permettant de modifier un "même" fichier. En passant par vi ou ed en ayant redirigé les entrées à partir du script. Exemple: ouvrir fic, aller en ligne 100, ajouter "coucou" Code bash :
Bon, c'est lourd, fastidieux, pas pérenne... mais ça fonctionne Citation:
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche. Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit. Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant. Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation. Dr. Adrian Rogers, 1931 |
||||
|
|
10
|
Copyright © 2000-2012 - www.developpez.com