#1 Le 22/09/2021, à 10: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.
Merci à tous
Olivier
Dernière modification par fplus39 (Le 20/10/2021, à 07:28)
Hors ligne
#2 Le 22/09/2021, à 11: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, à 11: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
Hors ligne
#4 Le 22/09/2021, à 11:12
- fplus39
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 ?
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
Dernière modification par fplus39 (Le 22/09/2021, à 11:14)
Hors ligne
#5 Le 22/09/2021, à 12: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, à 14:03
- fplus39
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é ?
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
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, à 14: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, à 09:36
- fplus39
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
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
Hors ligne
#9 Le 23/09/2021, à 09: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, à 10: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
Hors ligne
#11 Le 23/09/2021, à 11: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, à 13:43
- fplus39
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)"
Merci, c'est corrigé
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, à 14: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, à 14: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, à 17: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 le problème solutionné, 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, à 10:25
- fplus39
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.
Du coup je le fais dans la boucle, donc il traite un fichier, le supprime de Input puis passe au suivant
Avant dernière question :
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, à 10: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 le problème solutionné, 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, à 11: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
@ bientôt
Hors ligne
#19 Le 08/10/2021, à 14:30
- fplus39
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é ?
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, à 15: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 le problème solutionné, 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, à 07:27
- fplus39
Re : [RESOLU] execution commande multi fichiers
Merci beaucoup, je vais essayer de comprendre la construction proposée
Merci
Hors ligne
#22 Le 20/10/2021, à 12: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, à 12:45)
Hors ligne
#23 Le 29/10/2021, à 14:41
- fplus39
Re : [RESOLU] execution commande multi fichiers
Hello MicP,
Je vais regarder ta solution qui est séduisante
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