[BASH] Ajouter extension via feedback de commande file

Ajouter extension via feedback de commande file [BASH] - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 14-02-2007 à 04:38:08    

Bonjour,

 

Je suis encore bloqué dans mon TP d'université (intro unix).  Je ne vous demande pas de faire le problème à ma place, cependant j'avoue avoir bcp de mal avec ce TP car j'ai subis une chirgurgie dernièrement et je n'ai pas pu assister aux cours théoriques.

 
Citation :


5- (45 points)
Faites un script en Shell du nom de typefiledir avec un nombre variable de paramètres qui sont
des répertoires existants dans le répertoire courant. Pour chacun des répertoires nommés, votre
script doit vérifier (avec le programme file) chacun des fichiers, et s%u2019il trouve des fichiers dont le
type est dans la liste suivante, il doit ajouter le suffixe correspondant au nom de fichier (on
suppose que les fichiers n%u2019ont pas encore de suffixe) ou effectuer l%u2019action qui est indiquée. Si les
répertoires contiennent des sous-répertoires, votre script n%u2019a pas à parcourir ces sous-répertoires
mais simplement ajouter le suffixe .dir après le nom du répertoire.

 

Voici la liste des types de fichiers à identifier et leurs actions ou suffixes à ajouter au nom de
fichier : Bourne-Again shell (suffixe .sh), tar (suffixe .tar), zip (suffixe .zip), ASCII text (suffixe
.txt), JPEG (suffixe .jpg), PDF (suffixe .pdf), PostScript (suffixe .ps), code HTML (suffixe
.html), format compress (action de uncompress sur le fichier), gzip (action de gunzip sur le
fichier)

 

Je n'ai aucun problème avec les paramètres et j'ai déja mon "case" de fait pour effectuer les actions celon le type de fichier.

 

Parcontre, je bloque au niveau de la commande file.  Comment puis-je transférer le contenu de la commande file * dans une variable et boucler sur chacune des valeur par la suite ?

 

Dans un autre language de prog, j'aurais créer une "map" qui aurait contenu le nom du fichier et la réponse de file dans l'autre afin de boucler sur chacune des combinaison clé/valeur de la map, mais la j'ai aucune idée comment arrivé au même résultat en bash... HELP please

 

UPDATE: Au cas ou ça ferait partie de vos suggestions, je ne pense pas avoir le droit d'utiliser AWK.

 

Merci !!


Message édité par belzme le 14-02-2007 à 04:43:50
Reply

Marsh Posté le 14-02-2007 à 04:38:08   

Reply

Marsh Posté le 14-02-2007 à 05:49:56    

$* est ton ami pour la première question :o


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 14-02-2007 à 06:50:13    

Merci, cependant je n'ai pas de problème pour cette partie de la question puisque j'ai déjà fait le code qui boucle sur les paramètres de l'utilisateur.  Aurais-tu une piste de solution pour la partie qui m'embête ?
 

Reply

Marsh Posté le 14-02-2007 à 09:32:31    

a=$* [:pingouino]


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 14-02-2007 à 14:24:17    

$* contient tous les paramètres passé au script non ?
 
Donc si j'appel toto.sh param1 param2, le contenu de $* sera param1 param2 exact ?
 
Parcontre, si j'exécute une commande tel que file, le resultat de cette commande sera automatiquement ajouté à $* sans intervention de ma part ?
 
Désolé d'être lourd mais je ne comprend pas :*(

Message cité 1 fois
Message édité par belzme le 14-02-2007 à 14:24:54
Reply

Marsh Posté le 14-02-2007 à 14:32:11    

belzme a écrit :

$* contient tous les paramètres passé au script non ?
 
Donc si j'appel toto.sh param1 param2, le contenu de $* sera param1 param2 exact ?
 
oui
 
Parcontre, si j'exécute une commande tel que file, le resultat de cette commande sera automatiquement ajouté à $* sans intervention de ma part ?
 
ça n'a pas de sens ce que tu dis
 



---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 14-02-2007 à 14:43:20    

Bon dans ce cas, je crois que c'est ma première question qui n'étais pas clair.
 
Mon problème, est que dans mon script, si J'exécute file *, la commande imprime ceci à l'écran :
 
test.sh  :   Bourne-Again shell script
test.pdf :   PDF document blablabla
 
Je voudrais donc stocker ce résultat dans une variable pour pouvoir "boucler" dessus.
 
Donc en gros j'ai une question : comment stocké ce résultat dans une variable ou dans une "map" où nomdufichier/type serait la clé/valeur.
 

Reply

Marsh Posté le 14-02-2007 à 14:49:45    

http://www.google.fr/search?hl=fr& [...] ogle&meta= -> http://en.wikipedia.org/wiki/Assoc [...] .2C_....29
 
[:spamafote]


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 14-02-2007 à 15:43:34    

Faites un script en Shell du nom de typefiledir avec un nombre variable de paramètres qui sont
des répertoires existants dans le répertoire courant

 

=> dans ton script $@ représente tous les arguments, donc ici tous les répertoires, de $1 à $n.
=> "shift" décrémente tous les indices, $1 est perdu, $2 devient $1, $3 devient $2... $n devient $n-1
=> tu peux donc en bouclant sur shift et en consultant $1 accéder à tous les arguments, un par un

. Pour chacun des répertoires nommés, votre
script doit vérifier (avec le programme file) chacun des fichiers

 

=> tu peux utiliser find -type f DIR pour sortir tous les fichiers du répertoire. Si tu ne veux pas de récursion, on peut limiter la profondeur de find avec -mindepth et -maxdepth

 

, et s%u2019il trouve des fichiers dont le
type est dans la liste suivante, il doit ajouter le suffixe correspondant au nom de fichier (on
suppose que les fichiers n%u2019ont pas encore de suffixe) ou effectuer l%u2019action qui est indiquée.

 

=> file -b et mv devrait suffire

 

Si les
répertoires contiennent des sous-répertoires, votre script n%u2019a pas à parcourir ces sous-répertoires
mais simplement ajouter le suffixe .dir après le nom du répertoire.

 
=> le sujet se contredit, c'était écrit qu'on devait vérifier chacun des fichiers, mais bon... Pour les répertoires, un find -type d suffira

 

Voici la liste des types de fichiers à identifier et leurs actions ou suffixes à ajouter au nom de
fichier : Bourne-Again shell (suffixe .sh), tar (suffixe .tar), zip (suffixe .zip), ASCII text (suffixe
.txt), JPEG (suffixe .jpg), PDF (suffixe .pdf), PostScript (suffixe .ps), code HTML (suffixe
.html), format compress (action de uncompress sur le fichier), gzip (action de gunzip sur le
fichier)

  


Pour ton histoire d'itérer sur la sortie de file *, tu devrais plutôt itérér sur les fichiers et appeler find sur chacun d'entre eux  [:spamafote]
Si vraiment tu tiens à ton file *, on peut imaginer un

   file * | while read toto; do                          # parcours des lignes une par une
        gauche="`echo "$toto" | cut -d ':' -f 1`"     # coupe la ligne sur :, garde le premier champ
        droite="`echo "$toto" | cut -d ':' -f 2`"       # idem mais champ 2
        echo "Le fichier $gauche est de type $droite"
    done


Message édité par Xavier_OM le 14-02-2007 à 17:27:54

---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 14-02-2007 à 20:34:38    

Merci à vous deux :)
 
Je viens tout juste de terminer mon script.  Pour info, j'ai utiliser for i in $* au lieu de shift.
 
J'ai également adopté la solution file nomdudossier/* qui est plus simple pour moi.
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed