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 06/09/2022, à 14:55

judkil

basename en bash

Bonjour,


Je connais la fonction basename qui permet de récupérer le début du nom d'un fichier comme ceci,

for file in ./*.txt ; do
	name_m=$(basename $file *.txt)
    echo $name_m
done

mais est ce qu'elle serait possible pour

minoxi_molec1_rec-14_wo.txt
minoxi_molec5_rec-x-ray.txt
c8c1_molec1_rec-50_wo.txt
benza_molec1_rec-5_w.txt
c8c1_molec2_rec-8_w.txt

pour récuperer la partie avant molec_

minoxi
minoxi
c8c1
benza
c8c1

Mais comment faire pour récupérer une partie précise,

Merci

Dernière modification par judkil (Le 06/09/2022, à 14:57)

Hors ligne

#2 Le 06/09/2022, à 15:28

Hizoka

Re : basename en bash

Salut :

for file in ./*.txt ; do
    file="${file##*/}" # Remplace basename
    echo "${file%%_*}"
done

mais si tu ne traites que les fichiers du dossier courant, autant faire :

for file in *.txt ; do
    echo "${file%%_*}"
done

et je ne comprends pas :

name_m=$(basename $file *.txt)

pourquoi pas :

name_m=$(basename $file)

C'est censé planter...

Dernière modification par Hizoka (Le 06/09/2022, à 15:34)


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

Hors ligne

#3 Le 06/09/2022, à 15:30

kholo

Re : basename en bash

salut,
tu veux quelque chose comme ça ?

for file in ./*.txt ; do
    name_m=$(basename $file)
    echo $name_m
    arrIN=(${name_m//_/ })
    echo ${arrIN[0]}
done

coiffé par Hizoka lol

Hors ligne

#4 Le 06/09/2022, à 15:32

Hizoka

Re : basename en bash

C'est pas un peu lourd de passer par un tableau ?
et si ton fichier commence par un espace, quel sera le résultat ?


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

Hors ligne

#5 Le 06/09/2022, à 15:42

judkil

Re : basename en bash

Oui l'étoile c'est par analogie avec un

ls *_molec*

Merci beaucoup, ça marche

Est ce que tu pourrais expliquer cela

    file="${file##*/}" # Remplace basename
    echo "${file%%_*}"

Hors ligne

#6 Le 06/09/2022, à 15:47

Hizoka

Re : basename en bash

Bah ouais mais :
- tu as le nom l'emplacement du fichier donc, pas besoin d'utiliser des *.
- et si tu n'as qu'un bout du nom du fichier, il ne faut pas mettre d'espace entre la variable et le *.

${file##*/} : Prends la variable file et efface tout jusqu'au dernier /
${file%%_*} : Prends la variable file et supprime tout à partir du 1er _

Un peu de lecture : https://tldp.org/LDP/abs/html/parameter … ution.html

Dernière modification par Hizoka (Le 06/09/2022, à 15:52)


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

Hors ligne

#7 Le 06/09/2022, à 15:57

judkil

Re : basename en bash

Okk okk merci wink

Hors ligne

#8 Le 06/09/2022, à 16:16

erresse

Re : basename en bash

Hello,
En fait, avec basename, il est possible d'éliminer un suffixe du nom de fichier obtenu, avec l'option -s.

echo "$file"
minoxi_molec1_rec-14_wo.txt
echo $(basename -s _molec1_rec-14_wo.txt "$file")
minoxi

Toutefois, il n'est pas possible d'utiliser (du moins je n'y suis pas parvenu) les jokers dans la composition du suffixe en question. C'est donc assez peu utilisable dans le cas ici.


Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois le problème solutionné, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.

Hors ligne

#9 Le 06/09/2022, à 16:35

kholo

Re : basename en bash

Hizoka a écrit :

C'est pas un peu lourd de passer par un tableau ?
et si ton fichier commence par un espace, quel sera le résultat ?

oui... c'était pour suivre la première demande
... pour ce qui est des espaces, en effet... il faut des quottes à la ligne de basename mais ça ne fonctionne pas pour le tableau sans bidouilles... roll
bien vu... big_smile

Hors ligne

#10 Le 06/09/2022, à 20:42

Tawal

Re : basename en bash

Hello,

Soit la variable "file" contenant le nom du fichier :

file="minoxi_molec1_rec-14_wo.txt"

Récupérer que "minoxi" :

echo "${file%%_*}"

Récupérer que "molec1" :

file="${file#*_}"; echo "${file%%_*}"

Récupérer que "rec-14" :

file="${file%_*}"; echo "${file##*_}"

Récupérer que "wo" :

file="${file##*_}"; echo "${file%.*}"

Récupérer que "txt" :

echo "${file##*.}"

Dernière modification par Tawal (Le 06/09/2022, à 20:49)


Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#11 Le 06/09/2022, à 21:07

Watael

Re : basename en bash

là, je passe par un tableau.

$ file="minoxi_molec1_rec-14_wo.txt"
$ parts=( $(IFS='_-.'; echo $file) )
$ printf '%s\n' "${parts[@]}"
minoxi
molec1
rec
14
wo
txt

Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#12 Le 06/09/2022, à 21:33

Tawal

Re : basename en bash

+1 pour le tout en 1


Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne