#26 Le 04/01/2023, à 10:44
- MicP
Re : if et match de caractere
Bonjour
Avec l'interpréteur de commandes bash
Peut-être, avec cette ligne de commandes :
for f in dossier2/*; do rech="${f##*/}"; for g in dossier1/*; do [[ $g =~ $rech$ ]] && echo -e "${g##*/}\t$rech"; done; done
Ou bien, la même chose mais dans un script :
#!/bin/bash
for f in dossier2/*; do
rech="${f##*/}"
for g in dossier1/*; do
[[ $g =~ $rech$ ]] && echo -e "${g##*/}\t$rech"
done
done
=======
Ce qui donne :
mic@deb1156:~$ ls dossier{1,2}
dossier1:
353861_pose1_frame_100.pdb 353861_pose1_frame_50.pdb 89163_pose1_frame_50.pdb 89163_pose2_frame_25.pdb
dossier2:
frame_100.pdb frame_25.pdb frame_50.pdb frame_75.pdb
mic@deb1156:~$
mic@deb1156:~$ for f in dossier2/*; do rech="${f##*/}"; for g in dossier1/*; do [[ $g =~ $rech$ ]] && echo -e "${g##*/}\t$rech"; done; done
353861_pose1_frame_100.pdb frame_100.pdb
89163_pose2_frame_25.pdb frame_25.pdb
353861_pose1_frame_50.pdb frame_50.pdb
89163_pose1_frame_50.pdb frame_50.pdb
mic@deb1156:~$
Dernière modification par MicP (Le 04/01/2023, à 10:55)
Hors ligne
#27 Le 04/01/2023, à 11:10
- judkil
Re : if et match de caractere
Merci, le nom n'est pas plus court c'est que plutôt que le nom "contient" . C'est comme si on disait si "animaux" contient "nima" echo : de "animaux" et de "nima"
Hors ligne
#28 Le 04/01/2023, à 11:11
- Watael
Re : if et match de caractere
en espérant qu'il n'y a que 5 fichiers dans les deux répertoires
parce qu'à partir d'un certain nombre les boucles imbriquées vont prendre un temps certain.
je maintiens qu'il vaut mieux simplement tester l'existence du découpage du nom des fichiers du dossier courant (dossier1) dans le dossier2.
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#29 Le 04/01/2023, à 11:14
- Watael
Re : if et match de caractere
à partir du moment où la correspondance se fait sur la fin du nom, le nom correspondant est forcément plus court !
ce n'est pas comme sis tu cherchais frame_100 dans bla_bla_frame_100_bla_bla.pdb
tu nous expliques depuis le début que la correspondance se fait entre bla_bla_frame_100.pdb et frame_100.pdb, soit la fin du nom du premier fichier indiqué.
sinon, il faut nous réexpliquer précisément, et avec des exemples vraiment représentatifs.
Dernière modification par Watael (Le 04/01/2023, à 11:15)
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#30 Le 04/01/2023, à 11:32
- MicP
Re : if et match de caractere
C'est sûr que s'il y a des milliers (ou beaucoup plus) de fichiers dans chacun de ces répertoires,
il faudra utiliser une autre méthode qu'une imbrication de boucles for
D'ailleurs, avec un nombre peu élevé de fichiers,
il aurait été plus efficace de créer un tableau contenant les noms des fichiers du répertoire dossier1
et de supprimer de ce tableau le nom du fichier juste après qu'il ait été affiché.
Et puis, je n'ai fait que supposer, en me basant sur ce que j'ai pu lire jusqu'à présent dans ce fil de discussion,
que le nom des fichiers contenus dans le répertoire nommé dossier2 était à rechercher à la fin du nom des fichiers contenus dans le répertoire nommé dossier1
Dernière modification par MicP (Le 04/01/2023, à 11:42)
Hors ligne
#31 Le 04/01/2023, à 12:54
- Hizoka
Re : if et match de caractere
Il faut être bien plus précis dans la demande en effet...
Sinon, je propose un truc du genre :
on liste (via un fichier ou un array) tous les fichiers avec un nom long
on boucle sur tous les fichiers aux noms courts
on recherche le nom court dans la liste des fichiers longs (via grep ou une boucle for)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#32 Le 04/01/2023, à 14:54
- judkil
Re : if et match de caractere
Merci de vos réponses, la création d'un tableau me prendra beaucoup de temps manuel car j'ai plus de 200 fichiers, c'est pour cela que j'appelle les fichiers via leur nom.
Je cherche effectivement frame_100.pdb dans bla_bla_frame_100.pdb
Hors ligne
#33 Le 04/01/2023, à 15:10
- Watael
Re : if et match de caractere
mais non. Un tableau, ça se crée automatiquement :
$ tableau=( chemin/*.ext )
et hop ! tous les fichiers .ext du répertoire chemin sont dans le tableau.
je ne vois cependant pas de gain par rapport à la méthode simple que j'ai proposée :
- une boucle simple sur dossier1
- "raccourcissement" simple du nom
- test simple de l'existence du nom court dans dossier2
c'est si simple.
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#34 Le 04/01/2023, à 15:15
- judkil
Re : if et match de caractere
Mais quand je change le motif si 353861 est contenu dans 353861_pose1_frame_100.pdb
echo de 353861 et de 353861_pose1_frame_100.pdb cela ne marche plus.
Hors ligne
#35 Le 04/01/2023, à 15:39
- Watael
Re : if et match de caractere
ne sachant pas précisément ce que tu fais...
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#36 Le 04/01/2023, à 16:01
- Hizoka
Re : if et match de caractere
Il est difficile de comprendre ta demande...
Je cherche effectivement frame_100.pdb dans bla_bla_frame_100.pdb
Mais quand je change le motif si 353861 est contenu dans 353861_pose1_frame_100.pdb
Tu ne recherches pas la même chose dans les 2 cas...
Si tu veux en effet juste rechercher x dans y alors ma proposition est bonne...
En partant de :
ls -lR
./NomsLongs:
-rw-rw-r-- 1 hizoka hizoka 0 janv. 4 15:48 353861_pose1_frame_100.pdb
-rw-rw-r-- 1 hizoka hizoka 0 janv. 4 15:48 353861_pose1_frame_50.pdb
-rw-rw-r-- 1 hizoka hizoka 0 janv. 4 15:48 89163_pose1_frame_50.pdb
-rw-rw-r-- 1 hizoka hizoka 0 janv. 4 15:48 89163_pose2_frame_25.pdb
./NomsCourts:
-rw-rw-r-- 1 hizoka hizoka 2 janv. 4 15:58 89163.pdb
-rw-rw-r-- 1 hizoka hizoka 0 janv. 4 15:49 frame_100.pdb
-rw-rw-r-- 1 hizoka hizoka 0 janv. 4 15:49 frame_25.pdb
-rw-rw-r-- 1 hizoka hizoka 0 janv. 4 15:49 frame_50.pdb
-rw-rw-r-- 1 hizoka hizoka 0 janv. 4 15:49 frame_75.pdb
Si on fait :
# Liste des longs noms avec l'extension *.pdb
cd NomsLongs
FichiersLongsNoms=( *.pdb )
cd ../NomsCourts
# boucle des fichiers courts avec l'extension pdb
for Fichier in *.pdb
do
for Element in "${FichiersLongsNoms[@]}"
do
# Utilisation de ${x%.*} pour virer l'extension sinon seule la fin peut correspondre
[[ "${Element%.*}" == *"${Fichier%.*}"* ]] && echo "${Fichier%.*} est dans ${Element}"
done
done
cd ..
On obtient :
89163 est dans 89163_pose1_frame_50.pdb
89163 est dans 89163_pose2_frame_25.pdb
frame_100 est dans 353861_pose1_frame_100.pdb
frame_25 est dans 89163_pose2_frame_25.pdb
frame_50 est dans 353861_pose1_frame_50.pdb
frame_50 dans 89163_pose1_frame_50.pdb
Dernière modification par Hizoka (Le 04/01/2023, à 16:03)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#37 Le 04/01/2023, à 16:10
- Hizoka
Re : if et match de caractere
Si on teste avec 10 000 fichiers dans chaque dossier, la double boucle est très longue, grep va plus vite :
cd NomsLongs
find . -type f -iname "*.pdb" -printf "%f\n" > ../Fichiers.txt
cd ../NomsCourts
# boucle des fichiers courts avec l'extension pdb
for Fichier in *.pdb
do
x=$(grep "${Fichier%.*}" ../Fichiers.txt)
[[ $x ]] && echo -e "${Fichier%.*} est retrouvé dans :\n$x"
done
cd ..
Donne par exemple :
frame1610 est retrouvé dans :
blabla_frame1610.pdb
frame1611 est retrouvé dans :
blabla_frame1611.pdb
frame1612 est retrouvé dans :
blabla_frame1612.pdb
frame1613 est retrouvé dans :
blabla_frame1613.pdb
frame161 est retrouvé dans :
blabla_frame1611.pdb
blabla_frame161.pdb
blabla_frame1610.pdb
blabla_frame1613.pdb
blabla_frame1616.pdb
blabla_frame1617.pdb
blabla_frame1618.pdb
blabla_frame1619.pdb
blabla_frame1615.pdb
blabla_frame1612.pdb
blabla_frame1614.pdb
Mais bon, il ne faudrait pas qu'il y ait des sauts de lignes dans les noms des fichiers par exemple...
Est il possible qu'un nom court soit retrouvé plusieurs fois dans les longs ?
Doit on prendre en compte les extensions dans les comparaisons ?!
...
J'utilise des cd mais il vaudrait mieux éviter et supprimer les dossiers des noms des fichiers mais je pense que ça rajouterait du temps de traitement.
Dernière modification par Hizoka (Le 04/01/2023, à 16:15)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#38 Le 04/01/2023, à 16:19
- Watael
Re : if et match de caractere
quitte à jouer avec des fichiers, alors autant utiliser directement diff, ou comm...
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#39 Le 04/01/2023, à 16:22
- Hizoka
Re : if et match de caractere
Et une version sans fichier mais avec grep :
# Liste des longs noms avec l'extension *.pdb
cd NomsLongs
FichiersLongsNoms=( *.pdb )
cd ../NomsCourts
# boucle des fichiers courts avec l'extension pdb
for Fichier in *.pdb
do
x=$(grep "${Fichier%.*}" < <(echo -e "${FichiersLongsNoms[*]/%/\\n}"))
[[ $x ]] && echo -e "${Fichier%.*} est retrouvé dans :\n$x"
done
cd ..
Enfin voilà plusieurs idées mais tout dépend de ce que tu veux exactement et des éléments non prévus qu'il faudrait prendre en compte...
@Watael : J'y avais pensé car ça va très vite pour les grosses quantités de fichiers mais pour le coup, il n'y a pas d'infos en commun entre les 2 fichiers liste non ?
Dernière modification par Hizoka (Le 04/01/2023, à 16:24)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#40 Le 04/01/2023, à 16:50
- Watael
Re : if et match de caractere
zut!
¿ à coups de find et cut.. et finalement un diif/comm ?
ok, je sors.
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#41 Le 04/01/2023, à 17:18
- MicP
Re : if et match de caractere
mic@deb1156:~$ ls -1 dossier{1,2}
dossier1:
12345_blabla_nbvnbv_xxx.pdb
353861_pose1_frame_100.pdb
353861_pose1_frame_50.pdb
89163_pose1_frame_50.pdb
89163_pose2_frame_25.pdb
contenantframe_75.pdb_blabla
dossier2:
123
frame_100.pdb
frame_25.pdb
frame_50.pdb
frame_75.pdb
mic@deb1156:~$
#!/bin/bash
# contenu de monscript.sh
for f in dossier2/*; do
rech="${f##*/}"
for g in dossier1/*; do
[[ $g =~ $rech ]] && echo -e "${g##*/}\t$rech"
done
done
mic@deb1156:~$ ./monscript.sh
12345_blabla_nbvnbv_xxx.pdb 123
353861_pose1_frame_100.pdb frame_100.pdb
89163_pose2_frame_25.pdb frame_25.pdb
353861_pose1_frame_50.pdb frame_50.pdb
89163_pose1_frame_50.pdb frame_50.pdb
contenantframe_75.pdb_blabla frame_75.pdb
mic@deb1156:~$
Dernière modification par MicP (Le 04/01/2023, à 17:23)
Hors ligne