#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.
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 ?
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
mais je ferais encore plus court
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é.
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
[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
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 !
Un très grand merci !
Ubuntu Karmic Koala
Clevo M72OT
Intel Core 2 Extreme X3100
Intel GMA X4500 HD - 4 Go RAM
Hors ligne