Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 20-11-2014 19:53:09

debianux
Membre
Distrib. : debian-jessie-8.6_LVM-chiffré_dual-boot-uefi-w10
Noyau : 3.16.0-4-amd64
(G)UI : Xfce 4.10
Inscription : 19-05-2014

appliquer un programme à un nombre variable de fichiers

Bonjour,

je souhaite appliquer un programme "p", obligatoirement situé dans un repertoire "programme", à tous les fichiers (fichier1, fichier2, fichier3) d'un répertoire "repertoire" :

1/ quelle serait la commande la plus efficace pour ce faire ?

est-ce que ceci marche car j'ai un doute sur le séparateur des fichiers (espace) ?

/home/chemin/repertoire$ ls


fichier1  fichier2  fichier3


cd ~/programme


programme$


p /home/chemin/repertoire/{fichier1 fichier2 fichier3}



2/ autre paramètre, le nombre de fichiers à traiter est variable.
quel script pourrait dire au programme de s'appliquer tant qu'il y a des fichiers dans "repertoire" ?

merci d'avance.
Cordialement.
debianux

ps: j'ai cherché, rapidement, mais n'ai pas trouvé une source pour débuter dans cet "art" du script ou de la commande "sophistiquée" (pour moi:)), avec les explications sur l'utilisation par exemple des { } . une piste ?

Hors ligne

#2 20-11-2014 19:58:53

bendia
Admin stagiaire
Distrib. : Jessie
Noyau : 3.16.0-4-amd64
(G)UI : Gnome + XFCE + Console
Inscription : 20-03-2012
Site Web

Re : appliquer un programme à un nombre variable de fichiers

Bonjour

Peut-être que la commande find pourrait faire le boulot ?

Ben
___________________
La seule question bête, c'est celle qu'on ne pose pas.
file-Re06858991f6f328b4907296ac5cea283

En ligne

#3 20-11-2014 20:05:30

debianux
Membre
Distrib. : debian-jessie-8.6_LVM-chiffré_dual-boot-uefi-w10
Noyau : 3.16.0-4-amd64
(G)UI : Xfce 4.10
Inscription : 19-05-2014

Re : appliquer un programme à un nombre variable de fichiers

bonsoir bendia,
ok, je viens de trouver ça
https://debian-facile.org/atelier:chant … -de-sortie
mais je crains fort de n'être pas prêt rapidement à assimiler toutes ces finesses.
on dirait que les accolades ne sont pas indiquées dans le cas soulevé.

Dernière modification par debianux (20-11-2014 20:15:55)

Hors ligne

#4 20-11-2014 20:11:27

bendia
Admin stagiaire
Distrib. : Jessie
Noyau : 3.16.0-4-amd64
(G)UI : Gnome + XFCE + Console
Inscription : 20-03-2012
Site Web

Re : appliquer un programme à un nombre variable de fichiers

Non, c'était pour la question en général. Pour une première approche des scripts shell, il y a le wiki Debian-Facile smile

Ben
___________________
La seule question bête, c'est celle qu'on ne pose pas.
file-Re06858991f6f328b4907296ac5cea283

En ligne

#5 20-11-2014 20:18:52

enicar
Membre
Lieu : Grenoble
Distrib. : debian/sid
Noyau : Linux 4.8.10
(G)UI : openbox
Inscription : 26-08-2010

Re : appliquer un programme à un nombre variable de fichiers

Salut
une solution possible est


cd /home/chemin/repertoire/
for f in fichier1 fichier2 fichier3; do
    ~/programme/p "$f"
done
 



On peut aussi remplacer le :


for f in fichier1 fichier2 fichier3; do
 


par un truc du genre :


for f in *; do
 


pour sélectionner tous les fichiers qui se trouvent dans

 
/home/chemin/repertoire/
 



Cette solution suppose que le programme p ne sait traiter qu'un seul fichier à la fois. Est-ce le cas de ton programme ?
Voilà, si ça peut t'aider.


La machine, c'est dépassé ! On va tout remplacer par des humains big_smile

Hors ligne

#6 20-11-2014 20:39:54

sogal
Black Metal Modo
Distrib. : Debian Testing
Noyau : 4.7
(G)UI : Gnome
Inscription : 09-05-2013
Site Web

Re : appliquer un programme à un nombre variable de fichiers

Je complète simplement la très complète réponse d'enicar en précisant que tu peux appliquer sa solution à un type précis de fichier avec *.type


# exemple de déplacement de tous les fichiers JPEG dans le répertoire parent:
for f in *.jpeg; do mv $f .. ; done
 


Machine perso : Thinkpad x230 Debian Stretch | Machine pro : Thinpad T450 openSUSE Leap 42.2

Hors ligne

#7 20-11-2014 21:11:50

smolski
administrateur quasi...modo
Lieu : AIN
Distrib. : 8 (jessie) 64 bits + backports
Noyau : 4.6.0-0.bpo.1-amd64
(G)UI : gnome 3.14.1
Inscription : 21-10-2008

Re : appliquer un programme à un nombre variable de fichiers

Un petit complément encore, à propos de répertoire parent :
Le tuto : Répertoires et chemins. C'est d'enfer ! wink

"Définition d'eric besson : S'il fallait en chier des tonnes pour devenir ministre, il aurait 2 trous du cul." - JP Douillon
"L'utopie ne signifie pas l'irréalisable, mais l'irréalisée." - T Monod (source :  La zone de Siné)
"Je peux rire de tout mais pas avec n'importe qui." - P Desproges
"saque eud dun" (patois chtimi : fonce dedans)

Hors ligne

#8 20-11-2014 21:29:46

debianux
Membre
Distrib. : debian-jessie-8.6_LVM-chiffré_dual-boot-uefi-w10
Noyau : 3.16.0-4-amd64
(G)UI : Xfce 4.10
Inscription : 19-05-2014

Re : appliquer un programme à un nombre variable de fichiers

merci à tous !
pour être plus précis, il s'agit d'un programme "metier", non libre, qui décrypte des mails et dont l'unique description est la suivante :

Exécutable de décryptage d'un fichier texte crypté apicrypt (corps d'email)
usage :


apiuncrypt -s fichiersource [-k cheminclefs]



je suppose que l'on peut déduire que le programme ne sait traiter qu'un fichier à la fois.

le prestataire a très-très peu de clients sous linux, qui doivent donc essayer de se débrouiller smile

il y a un script en lien avec kmail, développé par un client du prestataire, mais qui, dans le cas qui me préoccupe, ne fonctionne pas comme il devrait.
et en attendant, j'essaye de mettre à disposition une solution intermédiaire entre un "rien" numérique et le script flamboyant smile

Hors ligne

#9 20-11-2014 21:38:43

smolski
administrateur quasi...modo
Lieu : AIN
Distrib. : 8 (jessie) 64 bits + backports
Noyau : 4.6.0-0.bpo.1-amd64
(G)UI : gnome 3.14.1
Inscription : 21-10-2008

Re : appliquer un programme à un nombre variable de fichiers

debianux a écrit :

et le script flamboyant


T'as raison debianux, y faut brûler tous les scripts !

Pardon... j'ai pas pu résister ! smile


"Définition d'eric besson : S'il fallait en chier des tonnes pour devenir ministre, il aurait 2 trous du cul." - JP Douillon
"L'utopie ne signifie pas l'irréalisable, mais l'irréalisée." - T Monod (source :  La zone de Siné)
"Je peux rire de tout mais pas avec n'importe qui." - P Desproges
"saque eud dun" (patois chtimi : fonce dedans)

Hors ligne

#10 20-11-2014 22:03:56

vv222
Membre
Lieu : Bretagne
Distrib. : GNU/Linux Debian « Sid »
Noyau : >= Linux 4.5.0 (amd64)
(G)UI : Openbox + ROX
Inscription : 18-11-2013
Site Web

Re : appliquer un programme à un nombre variable de fichiers

Puisqu’on parle de find plus haut, voici un exemple d’utilisation pour ton cas:

find /chemin/vers/repertoire -type f -execdir /chemin/vers/programme/p {} +


Cette commande lance 'p' une seule fois en lui donnant comme argument tous les fichiers sous 'repertoire'.

find /chemin/vers/repertoire -type f -execdir /chemin/vers/programme/p {} \;


Celle-ci lance 'p' une fois pour chaque fichier sous 'repertoire'. (équivalent de la boucle 'for' postée par enicar)


Jouer sous Debian ? Facile !

Hors ligne

#11 20-11-2014 22:35:20

debianux
Membre
Distrib. : debian-jessie-8.6_LVM-chiffré_dual-boot-uefi-w10
Noyau : 3.16.0-4-amd64
(G)UI : Xfce 4.10
Inscription : 19-05-2014

Re : appliquer un programme à un nombre variable de fichiers

donc j'ai essayé :

:~$ find ~/.local/share/local-mail/inbox/new -type f -execdir ~/apicrypt/apiuncrypt -s {} +


et ça ne décrypte pas

lorsque apiuncrypt est lancé depuis le repertoire apicrypt, ça marche car il trouve le sous-repertoire "Clefs" qui lui est nécessaire.

j'essaye donc de lui dire où elles sont (on se croirait dans fort boyard smile)

~$ find ~/.local/share/local-mail/inbox/new -type f -execdir ~/apicrypt/apiuncrypt -s {} -k ~/apicrypt +
find: Paramètre manquant pour « -execdir »



serait-ce que quelque chose soit mal placée, "à l'insu de mon plein gré" ? smile

Hors ligne

#12 20-11-2014 22:52:48

sogal
Black Metal Modo
Distrib. : Debian Testing
Noyau : 4.7
(G)UI : Gnome
Inscription : 09-05-2013
Site Web

Re : appliquer un programme à un nombre variable de fichiers

Essaye plutôt d'inverser les arguments de manière à ne pas perturber la syntaxe de find:

~$ find ~/.local/share/local-mail/inbox/new -type f -execdir ~/apicrypt/apiuncrypt -k ~/apicrypt  -s {} +


Machine perso : Thinkpad x230 Debian Stretch | Machine pro : Thinpad T450 openSUSE Leap 42.2

Hors ligne

#13 20-11-2014 22:59:09

debianux
Membre
Distrib. : debian-jessie-8.6_LVM-chiffré_dual-boot-uefi-w10
Noyau : 3.16.0-4-amd64
(G)UI : Xfce 4.10
Inscription : 19-05-2014

Re : appliquer un programme à un nombre variable de fichiers

merci sogalpunx,
j'ai donc essayé :

:~$ find ~/.local/share/local-mail/inbox/new -type f -execdir ~/apicrypt/apiuncrypt -k ~/apicrypt  -s {} +
mlbg@ThinkPad-X220:~$


il ne "tousse" plus mais ça ne décrypte pas

Hors ligne

#14 20-11-2014 23:18:12

debianux
Membre
Distrib. : debian-jessie-8.6_LVM-chiffré_dual-boot-uefi-w10
Noyau : 3.16.0-4-amd64
(G)UI : Xfce 4.10
Inscription : 19-05-2014

Re : appliquer un programme à un nombre variable de fichiers

quelques essais :

~$ find ~/.local/share/local-mail/inbox/new -type f -execdir ~/apicrypt/apiuncrypt -s {} -k ~/apicrypt/ +
find: Paramètre manquant pour « -execdir »


:~$ find ~/.local/share/local-mail/inbox/new -type f -execdir ~/apicrypt/apiuncrypt -s {} -k ~/apicrypt/Clefs +
find: Paramètre manquant pour « -execdir »


:~$ find ~/.local/share/local-mail/inbox/new -type f -execdir ~/apicrypt/apiuncrypt -s {} + -k ~/apicrypt/
find: prédicat inconnu « -k »


$ find ~/.local/share/local-mail/inbox/new -type f -execdir [ ~/apicrypt/apiuncrypt -s {} + -k ~/apicrypt/ ]
find: prédicat inconnu « -k »


:~$ find ~/.local/share/local-mail/inbox/new -type f -execdir [ ~/apicrypt/apiuncrypt -s {} -k ~/apicrypt/ ] +
find: Paramètre manquant pour « -execdir »


:~$ find ~/.local/share/local-mail/inbox/new -type f -execdir [ ~/apicrypt/apiuncrypt -s {} -k ~/apicrypt/ + ]
find: Paramètre manquant pour « -execdir »



il me faut reconnaître que je ne comprends pas grand chose à ce que je fais smile

Hors ligne

#15 20-11-2014 23:21:34

smolski
administrateur quasi...modo
Lieu : AIN
Distrib. : 8 (jessie) 64 bits + backports
Noyau : 4.6.0-0.bpo.1-amd64
(G)UI : gnome 3.14.1
Inscription : 21-10-2008

Re : appliquer un programme à un nombre variable de fichiers

Fait des tests sur des fichiers tests debianux.
find n'est pas une commande calme par elle-même, voire pas calme du tout, même ! smile

"Définition d'eric besson : S'il fallait en chier des tonnes pour devenir ministre, il aurait 2 trous du cul." - JP Douillon
"L'utopie ne signifie pas l'irréalisable, mais l'irréalisée." - T Monod (source :  La zone de Siné)
"Je peux rire de tout mais pas avec n'importe qui." - P Desproges
"saque eud dun" (patois chtimi : fonce dedans)

Hors ligne

#16 20-11-2014 23:31:07

debianux
Membre
Distrib. : debian-jessie-8.6_LVM-chiffré_dual-boot-uefi-w10
Noyau : 3.16.0-4-amd64
(G)UI : Xfce 4.10
Inscription : 19-05-2014

Re : appliquer un programme à un nombre variable de fichiers

merci pour la recommandation, suivie smile

Hors ligne

#17 20-11-2014 23:57:43

debianux
Membre
Distrib. : debian-jessie-8.6_LVM-chiffré_dual-boot-uefi-w10
Noyau : 3.16.0-4-amd64
(G)UI : Xfce 4.10
Inscription : 19-05-2014

Re : appliquer un programme à un nombre variable de fichiers

ici :
http://www.microhowto.info/howto/act_on … _find.html

To check which pathnames are selected, execute the find command without the -execdir option:


donc vérif :

find ~/.local/share/local-mail/inbox/new -type f


/home/mlbg/.local/share/local-mail/inbox/new/1416491654.R156.ThinkPad-X220_1.txt
/home/mlbg/.local/share/local-mail/inbox/new/1416491654.R156.ThinkPad-X220
/home/mlbg/.local/share/local-mail/inbox/new/1416491654.R449.ThinkPad-X220


et :

It may be helpful to use the pwd to display the directory in which each command will be executed. This requires some trickery to prevent pwd from being executed prematurely:

find ~/src/foo-1.0.0 -name "*.pl" -type f -execdir sh -c "echo \`pwd\` chmod 755 {}" \;



(Note that spaces and other special characters will not be escaped in the commands as listed.)


j'essaye :

find ~/.local/share/local-mail/inbox/new -type f -execdir ~/apicrypt/apiuncrypt -k ~/apicrypt "echo\`pwd\` -s {}" +



./1416491654.R156.ThinkPad-X220_1.txt

./1416491654.R156.ThinkPad-X220

./1416491654.R449.ThinkPad-X220


donc on est bien dans le bon répertoire des fichiers. le fichier "txt" est un fichier décrypté en direct ce qui montre que le programme de décryptage fonctionne.

Hors ligne

#18 21-11-2014 00:20:36

debianux
Membre
Distrib. : debian-jessie-8.6_LVM-chiffré_dual-boot-uefi-w10
Noyau : 3.16.0-4-amd64
(G)UI : Xfce 4.10
Inscription : 19-05-2014

Re : appliquer un programme à un nombre variable de fichiers

dans le man find :

-execdir command {} +
          Like -exec, but the specified command is run from the  subdirec-
          tory  containing    the  matched  file,  which is not normally the
          directory in which you started find.  This a  much  more    secure
          method  for invoking commands, as it avoids race conditions dur-
          ing resolution of the paths to the matched files.     As  with  the
          -exec option, the '+' form of -execdir will build a command line
          to process more than one matched file, but any given  invocation
          of command will only list files that exist in the same subdirec-
          tory.  If you use this option, you must ensure that  your     $PATH
          environment  variable  does not reference the current directory;
          otherwise, an attacker can run any commands they like by leaving
          an appropriately-named file in a directory in which you will run
          -execdir.



the specified command is run from the  subdirec-
          tory  containing    the  matched  file



or apiuncrypt est censé ne fonctionner que dans le répertoire "apicrypt" à cause des clés et sans doute de "path" internes (?)
et les fichiers à traiter sont dans "new", dans lequel execdir essaye de faire fonctionner apiuncrypt.

find peut-il fonctionner comme imaginé dans ce cas ?

et donc, ça y est :

j'ai mal au crâne


  smile

Hors ligne

#19 21-11-2014 13:52:43

enicar
Membre
Lieu : Grenoble
Distrib. : debian/sid
Noyau : Linux 4.8.10
(G)UI : openbox
Inscription : 26-08-2010

Re : appliquer un programme à un nombre variable de fichiers

Tu peux faire l'inverse :


cd ~/apicrypt/
find ~/.local/share/local-mail/inbox/new -type f -exec ./apiuncrypt '{}'
 



Ou sans find :


cd ~/apicrypt/
for f in ~/.local/share/local-mail/inbox/new/*; do
   if [ -f "$f" ]; then
   ./apiuncrypt "$f"
   fi
done
 



Il y a deux différences entre les deux méthodes.
La seconde méthode ne prendra pas en compte les fichiers dont le nom commence par un point et elle ne descend pas dans l'arborescence.
Je pense que dans ton cas, ça ne fera aucune différence.

Je dois ajouter qu'un programme qui ne peut fonctionne que dans un répertoire est mal fichu.
Il y a peut être moyen de lui préciser où il se trouve par le moyen de variables d'environnement.

Dernière modification par enicar (21-11-2014 13:56:22)


La machine, c'est dépassé ! On va tout remplacer par des humains big_smile

Hors ligne

#20 21-11-2014 18:22:14

debianux
Membre
Distrib. : debian-jessie-8.6_LVM-chiffré_dual-boot-uefi-w10
Noyau : 3.16.0-4-amd64
(G)UI : Xfce 4.10
Inscription : 19-05-2014

Re : appliquer un programme à un nombre variable de fichiers

merci enicar
j'essaierai quand j'aurai récupéré la machine : )

Hors ligne

#21 21-11-2014 19:29:09

enicar
Membre
Lieu : Grenoble
Distrib. : debian/sid
Noyau : Linux 4.8.10
(G)UI : openbox
Inscription : 26-08-2010

Re : appliquer un programme à un nombre variable de fichiers

euh, pour la version avec find j'ai oublié un \; pour délimité la commande à faire exécuter par find !
La bonne commande est plutôt :


cd ~/apicrypt/
find ~/.local/share/local-mail/inbox/new -type f -exec ./apiuncrypt '{}' \;
 



Voilà !

Dernière modification par enicar (21-11-2014 19:29:29)


La machine, c'est dépassé ! On va tout remplacer par des humains big_smile

Hors ligne

#22 21-11-2014 19:47:04

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian Stretch/Sid/Rc-Buggy
Noyau : Linux (≥ 4.3)
(G)UI : i3-wm (≥ 4.11)
Inscription : 07-07-2008
Site Web

Re : appliquer un programme à un nombre variable de fichiers

/me lance [ code=bash ] sur enicar

cool

captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

#23 21-11-2014 20:00:32

smolski
administrateur quasi...modo
Lieu : AIN
Distrib. : 8 (jessie) 64 bits + backports
Noyau : 4.6.0-0.bpo.1-amd64
(G)UI : gnome 3.14.1
Inscription : 21-10-2008

Re : appliquer un programme à un nombre variable de fichiers

c'est cruel ça !

"Définition d'eric besson : S'il fallait en chier des tonnes pour devenir ministre, il aurait 2 trous du cul." - JP Douillon
"L'utopie ne signifie pas l'irréalisable, mais l'irréalisée." - T Monod (source :  La zone de Siné)
"Je peux rire de tout mais pas avec n'importe qui." - P Desproges
"saque eud dun" (patois chtimi : fonce dedans)

Hors ligne

#24 21-11-2014 20:02:17

enicar
Membre
Lieu : Grenoble
Distrib. : debian/sid
Noyau : Linux 4.8.10
(G)UI : openbox
Inscription : 26-08-2010

Re : appliquer un programme à un nombre variable de fichiers

@captnfab : je m'en fiche, je prends cela d'où ça vient big_smile

La machine, c'est dépassé ! On va tout remplacer par des humains big_smile

Hors ligne

#25 23-11-2014 18:21:56

debianux
Membre
Distrib. : debian-jessie-8.6_LVM-chiffré_dual-boot-uefi-w10
Noyau : 3.16.0-4-amd64
(G)UI : Xfce 4.10
Inscription : 19-05-2014

Re : appliquer un programme à un nombre variable de fichiers

Bonjour,
i' doit y avoir un petit ajustement nécessaire smile

~$ cd apicrypt
mlbg@ThinkPad-X220:~/apicrypt$ find ~/.local/share/local-mail/inbox/new -type f -exec ./apiuncrypt '{}' \;

/home/mlbg/.local/share/local-mail/inbox/new/1416491654.R156.ThinkPad-X220_1.txt

/home/mlbg/.local/share/local-mail/inbox/new/1416491654.R156.ThinkPad-X220

/home/mlbg/.local/share/local-mail/inbox/new/1416491654.R449.ThinkPad-X220


pour l'instant, ça liste le contenu de "new"

ach smile

 ~/.local/share/local-mail/inbox/new -type f -exec ./apiuncrypt -s '{}' \;


$ ls  ~/.local/share/local-mail/inbox/new


1416491654.R156.ThinkPad-X220        1416491654.R449.ThinkPad-X220
1416491654.R156.ThinkPad-X220_1.txt  1416491654.R449.ThinkPad-X220.txt
1416491654.R156.ThinkPad-X220.txt



merci enicar ! smile


pour faciliter la vie de l'utilisateur, est-il possible de faire un script qui lancerait les deux commandes ?


ps : je sais bien que je ne suis pas "initié" mais est-ce que j'ai le droit de savoir ce que signifie

/me lance [ code=bash ] sur enicar

? smile

Hors ligne

Pied de page des forums