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 24/07/2013, à 10:06

Furax2801

[résolu] Find dans une boucle for : intégrer variable dans pattern

Bonjour,

Je dois réaliser un petit script qui va chercher des documents à partir d'une liste de références (liste.txt)
La liste énumère les références ligne par ligne.
Ces documents sont rangés dans une arborescence et sont déjà renommés avec leurs références uniques.
Ex : 12345_nom_du_doc.txt

#!/bin/bash

path=/doc/

for i in $(cat liste.txt); do
        find $path -type f -name $i* >result.log
done

Quand je lance le script, il me génère une log vide. hmm
Il semble que la variable dans le pattern après -name n'est pas supportée.
J'ai essayé avec -regex mais pas mieux.
Une idée ou une piste pour me dépanner ? roll

Merci.

Dernière modification par Furax2801 (Le 24/07/2013, à 14:56)


Ubuntu Karmic Koala
Clevo M72OT
Intel Core 2 Extreme X3100
Intel GMA X4500 HD - 4 Go RAM

Hors ligne

#2 Le 24/07/2013, à 10:24

hcm

Re : [résolu] Find dans une boucle for : intégrer variable dans pattern

Salut,

Pour connaître l'origine exacte du problème je te conseille de placer cette ligne en début de ton script

set -x

Tu verras ainsi où se trouve le problème. Cela pourrait être un problème de droits d'accès dans le répertoire à parcourir par exemple, mais bon ça peut aussi d'autres raisons.

Après selon le type d'information que tu attends dans ton fichier résultat, il peut être intéressant d'utiliser l'option -fprint de la commande find. A toi de voir.


Ubuntu 22.04.1 LTS - 64 bits / Intel Pentium(R) Dual CPU E2200 @ 2.20GHz × 2 / 2 Go RAM / 1,1 To DD / Carte Graphique Intel G33

Hors ligne

#3 Le 24/07/2013, à 10:26

Shanx

Re : [résolu] Find dans une boucle for : intégrer variable dans pattern

Salut

je n’ai pas le niveau en bash pour répondre à ta question. Par contre, j’ai remarqué que tu utilisais > et pas >>. C’est volontaire de ta part ? Parce que > remplace le contenu de result.log par le résultat de la commande (donc si la dernière itération de ta boucle ne renvoie rien, tu obtiens un fichier vide), alors que >> ajoute à la fin du fichier (donc rien n’est supprimé, mais tu risques d’avoir des lignes vides).


Mes randos : grande traversées des Alpes, de l'Islande, de la Corse, du Japon (en vélo), etc.
Traversée des États-Unis à pied

Hors ligne

#4 Le 24/07/2013, à 10:34

Hizoka

Re : [résolu] Find dans une boucle for : intégrer variable dans pattern

remplace

for i in $(cat liste.txt)
...

par

while read ligne
do
...
done < liste.txt

La boucle lit les lignes les unes apres les autres, ta boucle for n'est pas faite pour ca.

et remplace

find $path -type f -name $i* >result.log

par

find "${path}" -type f -name "${ligne}*" >> result.log

les " sont important dans le cas ou il y aurait des espaces ou des sauts de ligne.
et de toute facon, le name sans les " ne marche pas.
et comme le signale Shanx, utilise >>


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#5 Le 24/07/2013, à 10:46

pingouinux

Re : [résolu] Find dans une boucle for : intégrer variable dans pattern

Bonjour,
Je ferais ceci :

while read i
do
   [ -z "$i" ] && continue
   find "$path" -type f -name "$i*"
done <liste.txt >result.log
   [ -z "$i" ] && continue

permet de ne pas sortir toute l'arborescence s'il y a une ligne vide dans liste.txt

Hors ligne

#6 Le 24/07/2013, à 11:11

Hizoka

Re : [résolu] Find dans une boucle for : intégrer variable dans pattern

Toujours aussi balaise le pingouinux smile
mais je ferais encore plus court tongue

while read ligne
do
   [[ "${i}" ]] && find "${path}" -type f -name "${ligne}*"
done < liste.txt > result.log

Dernière modification par Hizoka (Le 24/07/2013, à 11:12)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#7 Le 24/07/2013, à 11:23

Furax2801

Re : [résolu] Find dans une boucle for : intégrer variable dans pattern

Merci merci mais je reste toujours bloqué. neutral

Hizoka, pingouinux, j'ai testé vos 2 méthodes.
J'ai rajouté un set-x (hcm)

#!/bin/bash
set -x
path=/doc/

#Hizoka
while read ligne
do
find "${path}" -type f -name "${ligne}*" >> result_Hizoka.log
done < liste3.txt

#pingouinux
while read i
do
   [ -z "$i" ] && continue
   find "$path" -type f -name "$i*"
done <liste3.txt >result_pinguouinux.log

La liste a été limitée à 3 références (liste3.txt)
Quand je lance le script, il n'arrive pas à recomposer le nom du fichier.
Les 2 logs sont également vides hmm

[mon_projet@ma_vm test]$ ./test.sh
+ path=/doc/
+ read ligne
*'find /doc/ -type f -name '53918
+ read ligne
*'find /doc/ -type f -name '53923
+ read ligne
*'find /doc/ -type f -name '53927
+ read ligne
+ read i
+ '[' -z $'53918\r' ']'
*'find /doc/ -type f -name '53918
+ read i
+ '[' -z $'53923\r' ']'
*'find /doc/ -type f -name '53923
+ read i
+ '[' -z $'53927\r' ']'
*'find /doc/ -type f -name '53927
+ read i
[mon_projet@ma_vm test]$

Or quand je lance en ligne de commande avec une seule référence cela fonctionne.

[mon_projet@ma_vm test]$ find /doc/ -type f -name 53918*
/doc/2013/06/21/53918_mon_fichier.xlsx

Ubuntu Karmic Koala
Clevo M72OT
Intel Core 2 Extreme X3100
Intel GMA X4500 HD - 4 Go RAM

Hors ligne

#8 Le 24/07/2013, à 13:10

hcm

Re : [résolu] Find dans une boucle for : intégrer variable dans pattern

Salut,

Je pense que c'est le caractère \r présent en fin de chaque ligne de ton fichier liste.txt qui pose problème, car il est considéré comme faisant partie du nom de fichier à rechercher. D'où un fichier de log vide comme résultat.
hypothèse: peut être ce fichier liste.txt a-t-il été édité avec un éditeur sous Windows ?

Vois si tu peux supprimer ce caractère dans chaque ligne de ton fichier (peut-être en le sauvegardant avec un éditeur linuxien), et relance ton script, ça devrait aller mieux.

Une fois mis au point, tu pourras retirer la commande set-x qui n'est là que pour activer le mode debug de ton script.

Dernière modification par hcm (Le 24/07/2013, à 13:20)


Ubuntu 22.04.1 LTS - 64 bits / Intel Pentium(R) Dual CPU E2200 @ 2.20GHz × 2 / 2 Go RAM / 1,1 To DD / Carte Graphique Intel G33

Hors ligne

#9 Le 24/07/2013, à 13:47

pingouinux

Re : [résolu] Find dans une boucle for : intégrer variable dans pattern

hcm   #9 a écrit :

Je pense que c'est le caractère \r présent en fin de chaque ligne de ton fichier liste.txt qui pose problème

@Furax2801 : Pour le confirmer, donne le résultat de cette commande :

xxd liste3.txt

Hors ligne

#10 Le 24/07/2013, à 14:55

Furax2801

Re : [résolu] Find dans une boucle for : intégrer variable dans pattern

Le problème venait effectivement du format du fichier (transmis par un collègue travaillant sous Windows)
Je l'ai passé en format unix avec vim et tout est ok depuis ! cool

Un très grand merci ! tongue


Ubuntu Karmic Koala
Clevo M72OT
Intel Core 2 Extreme X3100
Intel GMA X4500 HD - 4 Go RAM

Hors ligne