Pages : 1
#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
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
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
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...
bien vu...
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.
En 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
Pages : 1