je suis étudiant, et j'ai un petit shell à faire, mais je ne m'en sors pas du tout alors je cherche un peu d'aide.
Je dois écrire un programme qui liste l'ensemble des fichiers pour un utilisateur dont le nom est donné en paramètre sur la ligne de commande.
J'espère que quelqu'un pourra m'aider, merci par avance...
# RTFM
Posté par Frédéric Desmoulins (site web personnel) . Évalué à 6.
find / -user $1
# quelques pistes
Posté par Yann Hodique (site web personnel) . Évalué à 1.
je ne sais pas ce que tu entends par l'ensemble des fichiers pour un utilisateur, mais il y a des chances que ça fasse intervenir un ls ou un find (voir les pages de man pour les détails), et probablement un grep pour le filtrage, voire même un cut à la fin si besoin de changer le formatage de la sortie. Ces éléments seront vraisemblablement reliés par un pipe (|) à moins que tu ne passes par des fichiers temporaires (moins élégant mais peut-être plus simple à décomposer).
Voilà, en espérant que ça t'aide à te débloquer.
[^] # Re: quelques pistes
Posté par paflechien . Évalué à 1.
le prog que je veux faire sert à lister l'ensemble des fichiers situé sur l'espace disque spécifique à un utilisateur dont on rentre le nom en paramère.
est-ce plus clair ?
en tous cas, merci pour les réponses..
# MAN
Posté par Calim' Héros (site web personnel) . Évalué à 1.
exemples :
man ls
man grep
man woman
man man
man find
man bash
man sh
man info
MAN peut aussi etre remplacé par INFO ou encore GOOGLE
Ce genre de script relevant de la base de la programmation shell doit se trouver a peut pres dans n'importe quel bouquin (GOOGLE + OREILLY) ou sur n'importe quel site web (GOOGLE + SHELL SCRIPTING). Tout ceci necessite quand meme l'utilisation d'un CERVEAU et la je suis désolé il n'y a pas de manuel autre que descriptif.
Au passage LinuxFR n'est pas un site de resolution de TP.
[^] # Re: MAN
Posté par paflechien . Évalué à 1.
de deux, j'ai un cerveau, et si ça ne faisait pas 2 semaines que je bosse dessus, je n'aurais rien demandé.
de trois, je pensais que si je demandais un peu d'aide, on m'en apporterait sans me critiquer, et bien dorénavant, j'en chercherrai ailleurs.
pour finir, tout le monde n'est pas un pro de la prog, je débute, j'y pige que dalle, j'ai dépensé en une semaine 150¤ dans des bouquins de merde qui ne m'apporte rien de plus et je galère comme un rat, alors tes commentaires pourris tu peux te les mettre là où je pense...
sur ce, merci aux personnes qui m'ont répondues sans commentaires désagréables..
[^] # Re: MAN
Posté par moudj . Évalué à 1.
je ne te dit pas "à bientôt" :-)
[^] # Re: MAN
Posté par Calim' Héros (site web personnel) . Évalué à 3.
Ca fait quand même vachement TP a rendre je trouve.
Dire que les caricatures pretendent que les etudiants sont pauvres... Et la BU elle sert a rien?
Et t'en est ou après 2 semaines dessus? Parce que plutot que de donner la soluce je prefere te dire ou tu a faut et par ou chercher.
J'veux bien me les mettre la ou tu pense, mais cela ne changera rien au fait que MAN, INFO, GOOGLE et la BU seront tes meilleurs source d'info et que ls, grep et find risquent fortement de te servir pour ton script. Sans compter qu'apres verification les resultats de GOOGLE sur SHELL SCRIPTING [1] m'on l'air d'etre de bons points de depart pour apprendre le shell.
[1]http://www.google.fr/search?q=SHELL+SCRIPTING&start=0&start(...)
[^] # Re: MAN
Posté par Calim' Héros (site web personnel) . Évalué à 2.
http://www.linuxfr-france.org.invalid/article/these/smart-questions/smart-que(...)
[^] # Re: MAN
Posté par paflechien . Évalué à 2.
Je vais te placer le contexte.
J'ai commencé le développement unix il y a à peu près 1 mois, à raison de 2/3h par semaine.
Je n'ai pas encore approché une machine pour me faire les doigt, mon prof ne veut pas qu'on y touche.
Il m'a demandé de faire un shell script pour le réseu de mon école où on défini un nom de groupe, et grâce à ce nom de groupe, on liste les utilisateurs appartenant à ce groupe puis les fichiers sur l'espace disque de chaque utilisateur.
N'ayant pas beaucoup de connaissance du langage unix, j'ai commencé à chercher des scripts sur des pages françaises pour comprendre comment ça marche.
Puis vu que ce que je dois faire ne ressemblait à rien de ce que je trouvais, j'ai cherché sur les pages englophones. J'ai trouvé pas mal de choses interressantes, mais je n'arrive pas du tout à organiser tout ça pour faire un script convenable.
Alors du coup, j'ai trouvé ce site où j'ai posté un petit message pour qu'on m'aide à faire ça.
Mais je veux pas un programme tout fait que je rebalancerai en disant "c'est moi qui l'ai fait"
Je veux un programme qui marche où je peux comprendre pourquoi il marche et comment il marche. Je veux comprendre pourquoi on fait ci ou ça, comment on fait pour faire ça, etc...
J'ai acheté des bouquins mais les exemples dedans ne sont pas ludiques.
En fait, je n'y comprend pas grand chose et je cherche juste un peu d'explications...
voilà, je suis vraiment désolé pour mes paroles grossières...
[^] # Re: MAN
Posté par Khâpin (site web personnel) . Évalué à 2.
Je suis plutôt d'accord avec les réflexions de Calim' Héros (du genre "donne un poisson à un homme, tu le nourris un jour, apprends-lui à pêcher, tu le nourris toute sa vie), mais, sans vouloir te vexer, tu n'as pas l'air de vouloir apprendre à pêcher, et je n'aime pas voir quelqu'un qui a faim, et je n'ai pas envie que ce fil s'éternise.
Résumons ce que j'ai compris de ton problème: on donne en argument le nom d'un groupe (audio par exemple), et tu veux que ton script sorte la liste des fichiers appartenant à chacun des utilisateurs de ce groupe.
Je suppose que ce script est utilisé en root (sinon, je ne vois vraiment pas quoi faire).
Premièrement, comment connaître les utilisateurs de audio? Le plus simple est d'aller directement voir dans /etc/group par
#grep audio /etc/group
audio:x:100:user1,user2,user3
Ensuite, on ne veut conserver que les users, avec si possible des retours à la ligne à la place des virgules.
J'avais commencé par le faire avec grep puis cut puis sed
#grep audio /etc/group | cut -d : -f 4 | sed 's/,/\n/g'
Puis en lisant l'aide de sed (et surtout http://sed.sourceforge.net/grabbag/tutorials/oneliners.txt(...) , référencé dans la page de manuel de sed), j'ai vu qu'il y avait plus élégant:
#sed -e '/audio/!d;s///;s/:x:[0-9]*://;s/,/\n/g' /etc/group
Maintenant qu'on a la liste des utilisateurs, on en fait quoi?
Sachant (car tu as lu le man de find, ou simplement le premier post), que `find / -user nomdeluser` te donne la liste des fichiers de nomdeluser, il ne reste plus qu'à faire une boucle for:
#for i in `sed -e '/audio/!d;s///;s/:x:[0-9]*://;s/,/\n/g' /etc/group` ; do find / -user $i > /tmp/fichiers.$i ; done
Et voilà, tu as dans des fichiers séparé (/tmp/fichiers.user1 ...) la liste des fichiers de chaque utilisateur du groupe audio.
Ceci n'est même pas un script, ce n'est qu'une ligne de commande.
Pour ton information (je sais, je me répète), je ne suis pas informaticien de profession ni de formation, et je ne savais pas du tout comment faire cela avant d'avoir lu ton message. D'après les information des posts précédents, tu aurais pu le faire aussi.
Il suffit d'un peut de curiosité (ce que Calim' Héros appelle un cerveau, sans doute), et de lire les pages de manuels de sed et find (si tu es étudiant en info, je présume que tu sais quand même ce qu'est une boucle for).
Si tu n'as pas cette curiosité, je pense que tu ferais mieux de changer d'orientation.
Cordialement
[^] # Re: MAN
Posté par paflechien . Évalué à 1.
J'ai compris les différentes étapes de ce que tu as fait. Mon problème principal était que je ne comprenais pas trop comment organiser tout ça pour que ça fonctionne. Ce que tu as fait m'éclaire un peu et je t'en remercie.
J'ai une question tout de même. J'avais pensé faire intervenir un ls pour lister les fichiers du répertoire correspondant à un utilisateur du groupe , mais en pratique, je n'arrive pas à le faire. Je n'arrive pas à faire passer un ls dans le répertoire de l'utilisateur selectionné pendant une itération du for. Comment pourrais-je faire ceci ? Peut-on attribuer un numéro à chaque utilisateur du groupe pour ensuite faire les itérations ?
merci...
[^] # Re: MAN
Posté par Khâpin (site web personnel) . Évalué à 1.
Si tu veux numéroter les utilisateurs, rien ne t'empêche de créer un tableau nom[i] (je ne savais pas que bash pouvait le faire, mais la page de manuel de bash l'explique très bien dans la section "Tableaux"):
#!/bin/sh
j=0
for i in `sed -e '/audio/!d;s///;s/:x:[0-9]*://;s/,/\n/g' /etc/group`
do
nom[j]=$i
ls /home/${nom[j]}
j=$((j+1))
done
C'est assez gruik et inutile, mais si ça peut te faire plaisir...
Je me demande:
1) si tu as vraiment compris la ligne que je t'avais donnée
2) si tu sais ce que tu veux faire
Au moins, il y en aura un de nous deux qui aura appris quelquechose aujourd'hui...
[^] # Re: MAN
Posté par paflechien . Évalué à 1.
je pense avoir compris la syntaxe, mais je ne suis pas sûr.
la commande sed sert à faire des opérations sur un fichier puis afficher le résultat sur la sortie standard.
le paramètre -e indique qu'on va faire plusieurs commandes
par contre, pour ça, je suis un peu plus embêté :
/audio/!d;s///;s/:x:[0-9]*://;s/,/\n/g
Si ça ne te dérange pas trop, est-ce que tu pourrais m'expliquer à quoi correspond chaque paramètre ? J'ai regardé sur le site de sourceforge, mais je comprend pas trop comment tu as fait ça.
merci
[^] # Re: MAN
Posté par Khâpin (site web personnel) . Évalué à 1.
nom du groupe:x:GID:user1,user2
Je présume que le "x" signifie qu'il n'y a pas de mot de passe pour le groupe, ou qu'il est géré pas shadow.
Comme précisé dans mon premier message, la commande sed en question est équivalente à
#grep audio /etc/group | cut -d : -f 4 | sed 's/,/\n/g'
/audio/!d va chercher la ligne (on suppose qu'il n'y en a qu'une) qui contient audio, et ne conserver qu'elle (c'est l'équivalent d'un "grep audio", comme expliqué dans le lien fourni dans mon premier message)
s/// va supprimer le mot audio (comme expliqué dans le lien fourni dans mon premier message)
s/:x:[0-9]*:// va supprimer tout ce qui est de la forme :x:des chiffres:
Ces deux derniers sont donc l'équivalent du "cut"
enfin, s/,/\n/g va remplacer les virgules par des retours à la ligne (\n).
Pour savoir comment j'ai fait, bah... j'ai tatonné, essayé des trucs, puis d'autres, jusqu'à ce que ça marche. AMHA c'est comme ça qu'on apprend.
[^] # Re: MAN
Posté par paflechien . Évalué à 1.
est-ce que tu pourrais me donner de bonnes références pour pouvoir apprendre l'essentiel de la programmtion sous unix ? (livres, sites, etc...)
merci
[^] # Re: MAN
Posté par Khâpin (site web personnel) . Évalué à 1.
Les astuces de DLFP sont aussi très instructives, ainsi que tous les forums (lire des réponses à des questions que tu ne te poses pas apporte beaucoup).
Sinon, les grands classiques qui t'ont déjà été suggérés: les premiers résultats d'une recherche "shell scripting" sur Google, léa, les pages de manuel de bash, ls, sed, find, grep, awk, cut, tail, head, man, woman, c, re_syntax
[^] # Re: MAN
Posté par paflechien . Évalué à 1.
merci beaucoup pour ton aide..
[^] # Re: MAN
Posté par paflechien . Évalué à 1.
Dans ton exemple, le groupe "audio" est un groupe que tu prends pour exemple.
Dans ce que je veux faire, le nom du groupe est sur la ligne de commande, en paramètre. Donc on l'aura en faisant un $1 (enfin je pense).
Mais alors, comment peut-on faire la différence entre $1 quand on prend le paramètre et $1 quand on fait le for et que i=1 ?
est-ce juste d'écrire ça si on enregistre la ligne dans un programme et qu'on le lance avec le nom du groupe en paramètre :
#for i in `sed -e '/$1/!d;s///;s/:x:[0-9]*://;s/,/\n/g' /etc/group` ; do find / -user $i > /tmp/fichiers.$i ; done
???
merci
[^] # Re: MAN
Posté par Khâpin (site web personnel) . Évalué à 1.
Deuxième réponse: Bash est à peu près logique, et pour lui, i est une lettre (la 9ème de l'alphabet) et 1 est un chiffre (le deuxième). Il n'y a donc aucune chance que 1=i. En revanche, la variable $i peut valoir 1. En appliquant ton raisonnement, si le premier utilisateur s'appelle paflechien, la ligne deviendrait
fpaflechiennd / -user $paflechien > /tmp/fpaflechienchpaflechieners.$paflechien
Troisième réponse: la question ne se pose même pas, puisque bash effectue d'abord le sed blabla, puis attribue successivement à $i toutes les valeurs sortie par sed blabla.
Avant que tu ne me poses la question: je sais, ça ne marche plus si tu remplace audio par $1: Tu dois alors remplacer les apostrophes par des guillemets doubles. Pour savoir pourquoi, cherche "protection" dans le manuel de bash.
[^] # Re: MAN
Posté par paflechien . Évalué à 1.
la prochaine fois que je me lance dans l'écriture d'un script, j'essayerai d'avoir un pc avec unix à portée de main, c'est vraiment pas facile de faire sans !!! lol
[^] # Re: MAN
Posté par Khâpin (site web personnel) . Évalué à 1.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.