Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 22/09/2021, à 11:31

fplus39

[RESOLU] execution commande multi fichiers

Bonjour,

Je dois utiliser une commande pour traiter plusieurs fichiers :
-mon script sera dans un répertoire
-les fichiers sources sont dans un sous répertoire "Input"
-les fichiers traités seront placés par le script dans un sous répertoire "Output"
L"objectif est que le script soit lancé toutes les 180 secondes et traite tous les fichiers qui sont dans "Input", les enregistre dans "Output", puis supprime les originaux dans "Input"

Ce que j'arrive à faire pour l'heure:
je lance la commande dans un terminal et il traite bien un fichier seul depuis "Input" et le sauve dans "Output"

si vous pouviez m'aider à construire un script qui me permette de gérer cette tâche, se serait vraiment sympa. smile

Merci à tous
Olivier

Dernière modification par fplus39 (Le 20/10/2021, à 08:28)

Hors ligne

#2 Le 22/09/2021, à 12:00

Vobul

Re : [RESOLU] execution commande multi fichiers

Salut,

Déjà montre ton code, là on ne sait même pas dans quel langage tu es (il n'y a pas que bash dans la vie).

Ensuite il faut certainement ajouter un loop pour qu'il fasse tous les fichiers. C'est trivial. Voir même ça peut se faire avec une seule commande, pas besoin d'un script :

find input -type f -exec mv {} output \;

Et explique pourquoi tu veux faire ça aussi. Pourquoi les fichiers ne sont-ils pas créés directement dans output ? C'est quoi le contexte ?


Vobul
Utilisez le retour utilisable de commandes !!!
J'aime la langue française, mais je parle franglais, deal with it.
RTFM

Hors ligne

#3 Le 22/09/2021, à 12:07

fplus39

Re : [RESOLU] execution commande multi fichiers

Ce que j'ai fait :

#!/bin/bash
./macommande -i "Input/monfichier.ext" -o "Output/monfichiertraité.ext"

Le script tel quel fonctionne bien pour le fichier que je lui ai indiqué.
Ce que j'aimerai pouvoir faire, c'est qu'il fasse le traitement pour tous les fichiers qui sont dans Input puis qu'il vide le répertoire "Input"

Merci smile

Hors ligne

#4 Le 22/09/2021, à 12:12

fplus39

Re : [RESOLU] execution commande multi fichiers

Vobul a écrit :

Salut,

Déjà montre ton code, là on ne sait même pas dans quel langage tu es (il n'y a pas que bash dans la vie).

Ensuite il faut certainement ajouter un loop pour qu'il fasse tous les fichiers. C'est trivial. Voir même ça peut se faire avec une seule commande, pas besoin d'un script :

find input -type f -exec mv {} output \;

Et explique pourquoi tu veux faire ça aussi. Pourquoi les fichiers ne sont-ils pas créés directement dans output ? C'est quoi le contexte ?


Hello vobu,
Le contexte :
Les fichiers non traités sont placés par l'utilisateur dans Input
La commande doit donc les traiter (en fait elle modifier le contenu des fichiers)
Ensuite les les place dans le dossier Output

La commande doit être lancée toutes les 3 minutes mais un même fichier ne doit être traité qu'une seule fois, donc une fois traités, les fichiers sont déplacés pour ne pas être re-traités.
ensuite, les fichiers originaux (dans "input"), doivent être supprimés afin de ne pas être à nouveau traités lors du passage suivant de la commande.

Je ne sais pas si je suis très clair?
Merci à toi

edit : c'est la commande elle même qui place le fichier traité dans Output, donc, je n'ai pas besoin de gérer cet aspect en dehors de la commande smile

Dernière modification par fplus39 (Le 22/09/2021, à 12:14)

Hors ligne

#5 Le 22/09/2021, à 13:01

Watael

Re : [RESOLU] execution commande multi fichiers

salut,

La commande doit être lancée toutes les 3 minutes

pourquoi toutes les trois minutes ?
pourquoi pas dès qu'un fichier est déposé dans le répertoire dédié ?


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#6 Le 22/09/2021, à 15:03

fplus39

Re : [RESOLU] execution commande multi fichiers

Watael a écrit :

salut,

La commande doit être lancée toutes les 3 minutes

pourquoi toutes les trois minutes ?
pourquoi pas dès qu'un fichier est déposé dans le répertoire dédié ?

Bonjour Watae,
Ah ben si on peut faire ça, c'est parfait.
J'étais parti sur toutes les 3 minutes, par ce que j'imaginais devoir passer par une tache cron, et je ne sais pas si c'est une bonne idée de le faire, par exemple toutes les 2 secondes...

Mais si on peut agir sur détection de présence d'un fichier dans le répertoire d'origine, moi je vote pour big_smile
Mais je n'en suis pas encore là.
j'essaie déjà de lui faire prendre tous les fichiers présents

Merci beaucoup

Hors ligne

#7 Le 22/09/2021, à 15:43

LeoMajor

Re : [RESOLU] execution commande multi fichiers

salut,
Autre scénario. Tu as aussi les évènements de type fs filesystem avec inotify.  L' évènement est levé à point nommé et une fois seulement.   

Exemple:  un téléchargement est fait, peu importe la commande, sur la destination ~/Téléchargements.

while read ; do echo "$REPLY"; done < <(inotifywait -m --timefmt '%M:%S' --format '%T:%w%f:%e' -e all_events -r $HOME/Téléchargements) 

dans une autre console

lynx -dump https://forum.ubuntu-fr.org/viewtopic.php?id=2067100 > $HOME/Téléchargements/$(openssl rand -hex 2).test 

dans le 1ière console, tu obtiens un truc du genre;

...
29:45:/home/toto/Téléchargements/b0be.test:CREATE
29:45:/home/toto/Téléchargements/b0be.test:OPEN
29:46:/home/toto/Téléchargements/b0be.test:MODIFY
29:46:/home/toto/Téléchargements/b0be.test:MODIFY
29:46:/home/toto/Téléchargements/b0be.test:CLOSE_WRITE,CLOSE
29:48:/home/toto/Téléchargements/b0be.test:OPEN
29:48:/home/toto/Téléchargements/b0be.test:ACCESS
29:48:/home/toto/Téléchargements/b0be.test:CLOSE_NOWRITE,CLOSE
29:49:/home/toto/Téléchargements/b0be.test:OPEN
29:49:/home/toto/Téléchargements/b0be.test:ACCESS
29:49:/home/toto/Téléchargements/b0be.test:CLOSE_NOWRITE,CLOSE

fin du téléchargement; close_nowrite

Hors ligne

#8 Le 23/09/2021, à 10:36

fplus39

Re : [RESOLU] execution commande multi fichiers

LeoMajor a écrit :

salut,
Autre scénario. Tu as aussi les évènements de type fs filesystem avec inotify.  L' évènement est levé à point nommé et une fois seulement.   

Exemple:  un téléchargement est fait, peu importe la commande, sur la destination ~/Téléchargements.

while read ; do echo "$REPLY"; done < <(inotifywait -m --timefmt '%M:%S' --format '%T:%w%f:%e' -e all_events -r $HOME/Téléchargements) 

dans une autre console

lynx -dump https://forum.ubuntu-fr.org/viewtopic.php?id=2067100 > $HOME/Téléchargements/$(openssl rand -hex 2).test 

dans le 1ière console, tu obtiens un truc du genre;

...
29:45:/home/toto/Téléchargements/b0be.test:CREATE
29:45:/home/toto/Téléchargements/b0be.test:OPEN
29:46:/home/toto/Téléchargements/b0be.test:MODIFY
29:46:/home/toto/Téléchargements/b0be.test:MODIFY
29:46:/home/toto/Téléchargements/b0be.test:CLOSE_WRITE,CLOSE
29:48:/home/toto/Téléchargements/b0be.test:OPEN
29:48:/home/toto/Téléchargements/b0be.test:ACCESS
29:48:/home/toto/Téléchargements/b0be.test:CLOSE_NOWRITE,CLOSE
29:49:/home/toto/Téléchargements/b0be.test:OPEN
29:49:/home/toto/Téléchargements/b0be.test:ACCESS
29:49:/home/toto/Téléchargements/b0be.test:CLOSE_NOWRITE,CLOSE

fin du téléchargement; close_nowrite

houlàààà.
c'est un peu abscons pour moi ça....
Mais merci quand même...
En fait je vais essayer de partir sur le conseil de Vobul avec une boucle, mais je galère pas mal lol
Merci beaucoup smile

Hors ligne

#9 Le 23/09/2021, à 10:56

fplus39

Re : [RESOLU] execution commande multi fichiers

j'ai essayé ceci :

sudo find Input -type f -exec ./macommande.sh {} \;

Mais je ne pense pas que ça puisse marcher dans mon cas, car je dois impérativement entrer le chemin d'Input et D'Output ainsi que le nom du fichier à traiter dans les options de ma commande.
et effectivement, ça ne marche pas.
donc il faut que je passe par un script qui fait une boucle et lance ma commande pour chaque fichier trouver dans cette boucle et une fois la commande effectuée, supprime le fichier

Merci

Hors ligne

#10 Le 23/09/2021, à 11:50

fplus39

Re : [RESOLU] execution commande multi fichiers

voilà où j'en suis :

#!/bin/bash

je recherche les fichiers dans mon sous répertoire Input

for i in ./Input/*

Je tente d'isoler le nom du fichier dans une variable en supprimant le nom de répertoire du résultat (pour pouvoir l'utiliser dans mon Output):

do
var = "$i" | cut -c 9-
echo $var

mais ça ne marche pas :

 var = ./Input/monfichier.ext
monscript.sh: 11: var: not found
+ cut -c 9-
+ echo

il me sort cette erreur pour chacun des fichiers présents dans Input

Merci pour votre aide smile

Hors ligne

#11 Le 23/09/2021, à 12:43

Tawal

Re : [RESOLU] execution commande multi fichiers

Hello,

Ta substitution est mauvaise.

var="${i##*/}"

PS:
Sinon une substitution de commande se fait ainsi :

var="$(ma_commande)"

Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#12 Le 23/09/2021, à 14:43

fplus39

Re : [RESOLU] execution commande multi fichiers

Tawal a écrit :

Hello,

Ta substitution est mauvaise.

var="${i##*/}"

PS:
Sinon une substitution de commande se fait ainsi :

var="$(ma_commande)"

Merci, c'est corrigé smile
Pour supprimer les fichier dans Input Uniquement quand ils ont été traités, il me suffit de faire "rm $i" en fin de script ou il faut faire une vérification (si dans ce cas comment)

Hors ligne

#13 Le 23/09/2021, à 15:01

Tawal

Re : [RESOLU] execution commande multi fichiers

Plusieurs possibilités.
Dont une est de supprimer le fichier (avec rm "$i") dans la boucle, après traitement.
Une autre est de les supprimer tous après traitement en fin script en faisant :

rm ./Input/*

Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#14 Le 23/09/2021, à 15:35

fplus39

Re : [RESOLU] execution commande multi fichiers

super merci beauoucp.
J'ai une question théorique.
est ce que le script check tous les fichiers avant de les traiter ou bien est ce qu'il check la présence d'un fichier, le traite, check le suivant etc...
Je pose la question car il est possible qu'un utilisateur alimente le dossier Input alors que le script tourne déjà.
Dans ce cas, est ce que le script va dans tous les cas trouver ce nouveau fichier et l'ajouter dans la file ou pas?
Et comment cela risque til de se passe si le script se lance alors qu'un fichier est en cours de transfert dans le dossier Input?

Merci

Hors ligne

#15 Le 23/09/2021, à 18:09

erresse

Re : [RESOLU] execution commande multi fichiers

@fplus39: Excellente remarque !!!
En effet, j'étais aussi en train de me dire que si un fichier arrive dans "./Input/" pendant que le traitement est en cours, il ne faudrait surtout pas lancer la suppression globale des fichiers en fin d'exécution du script, car dans ce cas on supprimerait un fichier encore non traité !
Je pense qu'il serait utile de prévoir un verrouillage du répertoire "./Input" lorsque le script commence à travailler et le déverrouiller lorsqu'il se termine pour éviter ce risque.


Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois résolu, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.

Hors ligne

#16 Le 24/09/2021, à 11:25

fplus39

Re : [RESOLU] execution commande multi fichiers

erresse a écrit :

@fplus39: Excellente remarque !!!
En effet, j'étais aussi en train de me dire que si un fichier arrive dans "./Input/" pendant que le traitement est en cours, il ne faudrait surtout pas lancer la suppression globale des fichiers en fin d'exécution du script, car dans ce cas on supprimerait un fichier encore non traité !
Je pense qu'il serait utile de prévoir un verrouillage du répertoire "./Input" lorsque le script commence à travailler et le déverrouiller lorsqu'il se termine pour éviter ce risque.

Du coup je le fais dans la boucle, donc il traite un fichier, le supprime de Input puis passe au suivant smile

Avant dernière question : smile
mon script génère un fichier log pour chaque fichier traite, et le place à la racine du script.
J'ai créé un répertoire /logs et j'ai fait :

mv *Log*.txt /logs

les * car il y a du texte dynamique avant et après Log
Mais il me retourne cette erreur :

mv: la cible '/logs' n'est pas un répertoire

Pourtant , c'en est bien un dans lequel je peux me ballader créer et supprimer des fichiers manuellement gnarf

Merci

Hors ligne

#17 Le 24/09/2021, à 11:59

erresse

Re : [RESOLU] execution commande multi fichiers

En fait, le problème est : "Où as-tu créé ce répertoire "/logs" ?
Tel que tu l'indiques dans ta commande, il s'agit d'un répertoire créé à la racine du système. Est-ce le cas ?
Sinon, pour un adressage relatif, tu peux utiliser "./logs" si le répertoire est créé dans le répertoire courant du script, ou "~/logs" si tu l'as créé directement dans ton espace personnel...


Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois résolu, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.

Hors ligne

#18 Le 24/09/2021, à 12:15

fplus39

Re : [RESOLU] execution commande multi fichiers

oui, c'était bien le souci...
erreur bête de débutant snif
l'adresse relative à résolu l'erreur.

Merci beaucoup à toi et aux autres pour votre aide smile

@ bientôt

Hors ligne

#19 Le 08/10/2021, à 15:30

fplus39

Re : [RESOLU] execution commande multi fichiers

Watael a écrit :

salut,

La commande doit être lancée toutes les 3 minutes

pourquoi toutes les trois minutes ?
pourquoi pas dès qu'un fichier est déposé dans le répertoire dédié ?

bonjour,
Comment peut-on fait ça?
et du coup :
Quel est le processus qui vérifie qu'un nouveau fichier est déposé?
Comment est on certain qu'il attend que le fichier soit complètement transféré avant de le traiter?

Merci

Hors ligne

#20 Le 08/10/2021, à 16:20

erresse

Re : [RESOLU] execution commande multi fichiers

@fplus39:
Se reporter au message#7 de LeoMajor qui décrit le processus et le déroulé de l'exécution des phases successives...


Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois résolu, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.

Hors ligne

#21 Le 20/10/2021, à 08:27

fplus39

Re : [RESOLU] execution commande multi fichiers

Merci beaucoup, je vais essayer de comprendre la construction proposée smile
Merci smile

Hors ligne

#22 Le 20/10/2021, à 13:16

MicP

Re : [RESOLU] execution commande multi fichiers

Bonjour fplus39

Je te propose de faire un test de la commande inotifywait :

Il te faudra d'abord installer le paquetage inotify-tools

sudo apt install inotify-tools

=======
Pour la suite, je vais supposer que le chemin du répertoire Input est $HOME/repInput
et celui dans lequel les fichiers seront déplacés est $HOME/repOutput

=======
Créé le script nommé $HOME/traitement.sh qui va lancer l'exécution de commandes
sur chacun des fichier qui sera créé dans le répertoire $HOME/repInput :

Le contenu du script $HOME/traitement.sh serait, par exemple :

#!/bin/bash
#
# Ce script est lancé par la commande inotifywait
# "$1" est le nom du fichier qui vient d'être créé dans le répertoire que surveille la commande inotifywait
#

#
# Ici, tu pourras mettre d'autres lignes de commandes que tu voudrais lancer en utilisant le fichier "$1"
#

# Ci-dessous, je ne met qu'une commande de déplacement du fichier suivie de l'affichage d'un message
mv "$1" $HOME/repOutput/  &&  echo "Le fichier '$1' a été déplacé dans le répertoire '$HOME/repOutput/'"

Une fois ce fichier créé, il faudra rendre ce script exécutable :

chmod u+x $HOME/traitement.sh

=======
Ensuite, lance la ligne de commande suivante :

inotifywait --monitor --format '%w%f' -e CLOSE_WRITE -r $HOME/repInput/ | while read nomFichier; do $HOME/traitement.sh "$nomFichier"; done

Puis ouvre une autre fenêtre de terminal
et créé un (ou plusieurs) fichier(s) dans le répertoire $HOME/repInput/

echo "Contenu dans monFichierNo1.txt" > $HOME/repInput/monFichierNo1.txt

et regarde ensuite ce qu'il y a comme fichiers dans les répertoires $HOME/repInput/ et $HOME/repOutput/

Dernière modification par MicP (Le 20/10/2021, à 13:45)

Hors ligne

#23 Le 29/10/2021, à 15:41

fplus39

Re : [RESOLU] execution commande multi fichiers

Hello MicP,

Je vais regarder ta solution qui est séduisante smile
Mais :
si j'ajoute 3 fichiers à quelques secondes d'interval : si je comprends bien, il va donc lancer 3 fois ma commande de traitement des fichiers.
Et là ça va me poser souci car cette commande supporte très mal le multithread.... gnarf

Merci à toi

Olivier

Hors ligne