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". Attention, le forum rencontre actuellement quelques difficultés. En cas d'erreur 502, il ne faut pas re-valider l'envoi d'un message ou l'ouverture d'une discussion, au risque de créer un doublon.

La section divers se réorganise ! De nouvelles sous-sections à venir. (plus d'infos + donner son avis)

nombre réponses : 18

#0 -1 »  Question de débutant C » Le 05/02/2013, à 18:58

Latsuj
Réponses : 4

Bonjour,

Avant de commencer, il faut savoir que je n'ai pas trop l'habitude du C. Je programme beaucoup plus en Java et la j'ai un problème de compression sur une chose.
Exemple de petit code;

#include <stdio.h>

int main()
{
  int c;
  while( (c = getchar()) != EOF)
      putchar(c);
  return 0;
} 

Alors la chose qui me dérange est que le getchar accepte des lettres et que c accepte ces lettres. Or, on a defini que c est un int. Ayant l'habitude de java, je comprend pas comment un entier puisse accepter une string ? J'ai regarde la doc, j'ai vu que la fonction faisait un cast d'un char en int mais ça ne m'avance pas plus. Que passe réellement la fonction getchar() ? Est ce un code ascii en binaire ? ( Genre z=7A=01111010 ).

J'aimerais comprendre cette magie.
Merci d'avance.

#1 Re : -1 »  [RESOLU] Texte et remplacement récurcif » Le 03/02/2013, à 23:28

Latsuj
Réponses : 4

Bonsoir,

Pour ma part, je ferais ceci :

for i in $(seq 5 8); do
	sed -i "s/^\($i.\)\(.*\)/\2/" toto.txt
done

Explication :

# Une boucle avec un i qui prend les valeurs de 5 a 8
for i in $(seq 5 8); do
        # Le sed avec l'option -i pour remplacer directement dans le fichier
        # "s : pour indiquer la substitution
        # ^($i.) : toute les lignes qui commence par les valeurs de i suivi d'un point
        # (.*) : n'importe quoi qui suit ce qu'il y a au dessus
        # \2 : On ne garde que ce qu'il y a contenu dans les deuxieme parenthese (.*)
        # Ensuite le nom du fichier
       sed -i "s/\($i.\)\(.*\)/\2/" toto.txt
done;

Bonne soirée

#2 -1 »  Update de .bash_history à partir d'un script » Le 27/01/2013, à 12:14

Latsuj
Réponses : 15

Bonjour,

Une question concernant le fichier de l'historique (.bash_history), je cherche à le mettre à jour à partir d'un script shell. Comme vous le savez sûrement, le fichier de l'historique des commandes ne se met à jour que lorsque vous quitter le terminal.
On peux bien sur forcer l'enregistrement à chaque commande :

export PROMPT_COMMAND='history -a'

Mais je cherche à faire la même chose sans utiliser de commande dans mon terminal. Pour résumer, je cherche à update mon historique de commande à partir d'un script shell pour récupérer la dernière commande tapé dans le terminal où est lancé le script.

Auriez-vous une idée ?

Merci d'avance d'avoir pris la peine de lire.
Latsuj

#3 Re : -1 »  Update de .bash_history à partir d'un script » Le 27/01/2013, à 13:45

Latsuj
Réponses : 15

Bonjour,

J'essaye de récupérer la dernière commande lancé afin de la modifié suivant mes envies par la suite. Mais pour cela, il faut que je sache qu'elle est la commande lancé juste au dessus de l’exécution de mon script et je bloque à cet endroit.
Je souhaitais le faire via l'historique du shell mais celui-ci ne s'update qu'après la fermeture du shell et non après l’exécution d'une commande. Si tu/vous as/avez un autre moyen de récupérer la commande lancé avant le script, je suis preneur. 

Bonne journée.

#4 Re : -1 »  Update de .bash_history à partir d'un script » Le 27/01/2013, à 16:57

Latsuj
Réponses : 15

Bonjour,

C'est un script sans intérêt que j'essaye de faire, juste pour voir si j'en étais capable. Apparemment non.
Le but voulu est d'annuler la commande précédente si c'est une commande affectant des fichiers ou répertoires, exemple avec un move, cp...ext
Et faire ceci à partir d'un script, pas une commande particulière.

Mais pour réaliser ceci, je suis obligé de récupérer d'une manière ou d'une autre la commande précédente.

Je pensais utiliser dans un premier temps, les commandes !-n, mais l'historique ne marche pas dans les scripts shell. J'ai cherché à le faire autrement.
Et je pensais alors utiliser le fichier .bash_history. Encore une fois, je suis bloqué. Je ne sais pas si il est possible d'update le fichier history à partir d'un script.
Mais tu as raison, à partir du moment où je lance la commande dans le shell courant, j'ouvre un sous-shell et je suis bloqué sur l'autre...J'y pensais mais peut-etre y avait-il un moyen de faire que je ne connaissais pas encore.

Merci pour tes réponses.
J'abandonne pas, je continue à chercher. Si quelqu'un a une idée, je suis preneur.
Bonne journée.

#5 Re : -1 »  Update de .bash_history à partir d'un script » Le 27/01/2013, à 17:59

Latsuj
Réponses : 15

Bonsoir,

Vos idées sont bonnes et je vous les auraient sûrement empreinté. Mais je souhaite me limiter à un script, d'où un lancement du script basic :

./mon_script
bash ./mon_script

C'est peut être impossible ce que je souhaite faire, n'étant pas un expert dans ce domaine. hmm

Ta solution pingouinux est celle que je pensais faire, mais je veux pas le faire à l'appel. C'est pour cela que je voulais export (premier post) mais encore une fois, j'ai un problème...

Non, je vois pas comment faire. Impossible peut-être ?

Merci de vos réponses.
Bonne soirée.

#6 Re : -1 »  (Résolu)Utilisation de sed » Le 01/02/2013, à 20:12

Latsuj
Réponses : 9

Bonsoir,

OLDIFS=$IFS
IFS=''
for file in *; do
        for ligne in $(cat $file); do
	       echo $ligne | sed -i 's/http:\/\/tata\/toto\/bibi//g' $file
        done
done
IFS=$OLDIFS

Et tu fais ceci avec comme dit avec l'option i et sur tout les fichiers dans le repertoire. Si tu as des dossiers dans dossiers...ext. Tu peux utiliser le find à la place de *.

Bonne soirée

#7 Re : -1 »  Script pour faire l'inventaire de fichiers » Le 01/02/2013, à 20:34

Latsuj
Réponses : 3

Bonsoir,

Comme ceci :

 var1=( $(ls) ); #Rentre le resultat dans un tableau
echo ${var1[1]}; #pour obtenir la premiere cellule...ext
echo ${var1[2]}; # la deuxieme

echo ${var1[*]}; # Pour obtenir toutes les cellules

Bonne soirée.

#8 -1 »  Symbole de l'IFS » Le 29/01/2013, à 23:51

Latsuj
Réponses : 7

Bonsoir,

Voila plusieurs fois qu'en lisant des scripts, je tombe sur l'IFS, le fameux séparateur de champs. Je pensais avoir bien compris comment ce dernier fonctionnait. Mais sur certains code, je ne comprends pas. Par exemple, si j'ai un fichier texte de ce type :

ligne.txt :

aaa bbb ccc
ddd eee fff
ggg hhh iii

Si je fais ceci :

while IFS=$' ' read var1 var2 var3; do
echo $var1 $var2 $var3
done;

Il va bien renvoyé sur chaque variable les valeurs voulu, var1=aaa, var2=bbb, var3=ccc puis var1=ddd,...ext. Ici, pas de problème, j'ai défini que mon séparateur de champs n'était autre qu'un espace.

Mais...Si je fais ceci :

IFS=:
echo $(cat ligne.txt)

Il m'affiche le fichier telle que je l'ai présenté au départ. D'où ma question, à quoi fait allusion le ':' ? Qu'est ce que le shell comprend en lisant ce caractère ?

Merci d'avance et bonne soirée.

#9 Re : -1 »  Connaître la taille des dossiers contenant... » Le 30/01/2013, à 19:22

Latsuj
Réponses : 10

Bonsoir,

Pourquoi ne pas faire la boucle qu'à donné pinguouinux et tu additionne chaque résultat d'un du -sh (si tu souhaite la taille de l'ensemble de ces fichier en lisible). Bien sur, il faudra faire une distinction avec la derniere lettre du du qui doit etre soit K pour les kilo-octet ou M pour mega-octet.

Une question, il n'y a que des fichier flac dans tes dossiers ?

Bonne soirée.

#10 Re : -1 »  Remplacer le caractere % par _ dans tous les fichiers des sousdossiers » Le 29/01/2013, à 23:40

Latsuj
Réponses : 15

Bonsoir,

Personnellement, je l'aurais comme ceci :

#!/bin/bash

for file in $(find . -name "*%*"); do
	contains=`expr index "$file" '%'`
	if [[ $contains != 0 ]]; then
		nname=${file/\%/\_};
		mv "$file" "$nname"
	fi
done

Puis-je savoir à quoi sert le shopt -s nullglob globstar ? La commande help shopt n'étant pas très explicite, je ne comprends pas.

Bonne soirée.

#11 Re : -1 »  Remplacer le caractere % par _ dans tous les fichiers des sousdossiers » Le 30/01/2013, à 10:45

Latsuj
Réponses : 15

Bonjour,

Watael, je ne comprend pas trop ce que tu reproche à mon utilisation de 'expr'. Pourrais-tu développer ?

Si j'utilisais le double crochet, ne faudrait il pas plutôt mettre des apostrophes ? Si par exemple un nom de fichier comprenait des espaces ?

 if [[ "$file" = *%* ]] 

Bonne journée

#12 -1 »  Incomprehension du Random » Le 29/01/2013, à 11:08

Latsuj
Réponses : 4

Bonjour,

Je suis tombé sur un code qui contient une ligne que je ne comprend malheuresement pas :

 nombre=$((RANDOM%25+6)) 

Si il n'y avait pas le "+6", j'aurais compris. on aurait juste appliqué un modulo pour récupérer un nombre compris entre 0 et 24. Mais avec le +6, le resultat est assez inattendu pour ma part, on obtient un nombre compris entre 6 et 30. Pourquoi ? A quoi le + fait-il référence ? Pourquoi entre 6 et 30 ?

Merci d'avance de vos réponses.
Latsuj

#13 Re : -1 »  Incomprehension du Random » Le 29/01/2013, à 12:14

Latsuj
Réponses : 4

Bonjour,

Hum...Bizarre que le décalage soit fait apres, quand je pense aux chaines de caractère, c'est l'inverse ( ${chaine:decalage:longueur} ).
Ok, merci pour ta réponse.

Bonne journée.

#14 Re : -1 »  Incomprehension du Random » Le 29/01/2013, à 12:34

Latsuj
Réponses : 4

Bonjour,

Haaaaaa.....Ok. Je ne l'avais pas compris comme cela. Ok bah du coup ça prend tout son sens.

Merci.
Bonne journée.

#15 Re : -1 »  KSH insérer une chaine de caractère dans un endroit fixe » Le 29/01/2013, à 02:11

Latsuj
Réponses : 6

Bonsoir,

En bash,

#!/bin/bash

# Chaine que l'on souhaite ajoute
chaine="zzz"
# Creation du fichier intermediaire
touch fichierintermediaire.txt;

# Pour tous les fichiers
for file in *; do

	# Sur chaque ligne de ce fichier
	while read ligne; do

		# On prend les 9 premiers caractères
		testligne=${ligne:0:9}
		# Et on test si il contient une virgule
		compteur=`expr index "$testligne" ','`

		# Le remplacement
		if [[ $compteur = 0 ]]; then
			newligne=${ligne/$testligne/$testligne$chaine};
		else
			newligne=${ligne/","/","$chaine};
		fi
		echo $newligne 1>> fichierintermediaire.txt
	done < $file

	# On efface le fichier et on le remplace par le nouveau fichier
	rm $file; mv "fichierintermediaire.txt" "$file";	

done

exit 0;

Bonne soirée.

#16 -1 »  [Résolu] Petite question concernant le manuel du shell » Le 26/01/2013, à 20:08

Latsuj
Réponses : 2

Bonsoir la communauté,

Une petite question concernant la commande "man" de la console linux, pourquoi certaines commandes ne disposes pas de manuel ?
Par exemple, la commande let.
Une question qui n'est pas capitale mais ça m'intrigue.

Merci d'avance à ceux qui prennent la peine de lire le post.
Bonne soirée.

Ps: Désolé, si je n'est pas posté dans la bonne section. Je suis nouveau sur ce forum et je voyais pas trop où poster.

#17 Re : -1 »  [Résolu] Petite question concernant le manuel du shell » Le 26/01/2013, à 20:19

Latsuj
Réponses : 2

Bonsoir,

Je te remercie pour cette réponse rapide.

Bonne soirée.