☑[bash] Boucle for sur un fichier unique OU contenu d'un dossier ?

☑[bash] Boucle for sur un fichier unique OU contenu d'un dossier ? - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 02-05-2013 à 13:11:36    

Bonjour,

 

j'ai un petit souci qui n'est pas un puisque je peux passer outre mais je souhaite ne pas allonger mon script inutilement.

 

Voilà, j'ai un code qui traite des fichiers images au format jpeg.
Pour l'instant il "mange" un répertoire que l'utilisateur lui passe en argument. Mais je souhaite aussi pouvoir lui passer un fichier unique en donnant le nom de ce fichier lors de l'appel du script, en lieu et place d'un répertoire. L'argument du fichier étant sous la même "lettre" que celui du dossier lorsqu'on décide de traiter un dossier (cette lettre porte sans doute un nom plus spécifique ; ce sont ces petites lettres précédées d'un tiret et qui sont lues par getopts).
En l'occurrence l'argument est passé comme ceci : mon_script.sh -d "chemin/vers/dossier"
Et ce chemin est stocké dans la variable ${fichier}.

 

Bref, voilà un peu la structure simplifiée de ma boucle :

 

for i in "${fichier}"/*.[Jj][Pp]*[Gg]; do j='echo "${i}" | sed -e 's/\.jp\(e\)*g/\_processed.jp\1g/gI''; \
do
 # traiter les fichiers ${i} jpg du dossier les uns après les autres en leur faisant subir plein de trucs
done


Je profite en 1ère ligne de passer toutes les extensions jpeg en minuscules.

 

J'ai mis cette boucle for dans un test : if [ -d "${fichier}" ]

 

Ce que je peux faire, mais que je ne veux pas faire, c'est de remettre toutes les commandes qui sont dans la boucle for, dans un autre test : if [ -f "${fichier}" ]
Mais ça ferait doublon, et allongerait, je pense, inutilement le code, surtout que les commandes resteront les mêmes, mais elles seraient appliquées sur un fichier unique, au lieu des N fichiers contenus dans un dossier.

 

Merci beaucoup de vos tuyaux !!
Je dois passer à côté d'un truc tout con là...


Message édité par Swiss_Knight le 07-05-2013 à 00:47:02

---------------
Hergestellt in der Schweiz.
Reply

Marsh Posté le 02-05-2013 à 13:11:36   

Reply

Marsh Posté le 02-05-2013 à 15:27:17    

tu mets ton traitement dans une fonction  
genre
et dans ta boucle à chaque itération :  

Code :
  1. [ -f ${fichier} ] && fonction(paramfichier) || fonction(paramrepertoire)


 
y'a qu'à ajouter une variable pour sortir $REP$FICH  au niveau de la boucle  
par defaut ça tombe sur "${REP}"/*.[Jj][Pp]*[Gg] et  sinon avec paramfichier ça donnc $REP/$FICH
 
y'a que ça a faire ça suffit.
 


---------------
Collectionner les vieux serveurs c'est chouette mais c'est lourd et ça prend de la place ;)
Reply

Marsh Posté le 06-05-2013 à 21:57:28    

Salut,
je souhaite éviter de multiplier les fichiers et tout conserver dans un seul fichier (et puis je débute en bash, je ne connais pas le fonctionnement des fonctions). Le script est ultra-spécifique ; il me sert à traiter des images au format jpg.
Actuellement je lui passer un dossier en argument, et il traite tout ce qu'il trouve dedans.
Mais j'aurais aimé pouvoir ne traiter ponctuellement qu'une seule image, sans devoir créer un dossier vide pour l'y déplacer afin de lancer le script sur ce nouveau dossier.

 

EDIT : résolu !

 

En effectuant un petit test avant de lancer la grande boucle for, et grâce à la commande dirname, je peux travailler systématiquement sur un dossier. Donc même en spécifiant un fichier, je travaille sur le dossier qui contient ce fichier.
Oui mais si le dossier contient d'autres images ?
Pas grave : je conserver le nom du fichier en faisant un test avant, dans un tableau, et je fait tourner la boucle sur ledit tableau qui ne contiendra que le nom d'un fichier si un fichier a été passé au script, et le nom de tous les fichiers jpg si un dossier a été passé au script.

 

#


Message édité par Swiss_Knight le 07-05-2013 à 00:41:34

---------------
Hergestellt in der Schweiz.
Reply

Sujets relatifs:

Leave a Replay

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