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.

#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. big_smile

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 ! smile

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. big_smile


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. sad

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... hmm


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! smile

¿ à coups de find et cut.. et finalement un diif/comm ?
big_smile

ok, je sors. lol


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