#1 Le 16/05/2019, à 11:42
- L'Africain
Récuper partie de nom de fichier pour l'écrire dans fichier
Bonjour,
Je cherche à récupérer une partie d'un nom de fichier (ou tout le nom) pour l'écrire à la fin de la première ligne de ce même fichier. Et à mettre ça dans une boucle car j'en ai beaucoup des fichiers à traiter et cela régulièrement.
Par exemple le fichier : 01_GEN.txt (ou GEN.txt) je voudrais que la première ligne du même fichier qui ressemble à ça:
\id
devienne:
\id GEN
Le nom du fichier peut être soit en majuscule soit en minuscule, mais dans la première ligne du fichier il faut que ça soit absolument en majuscule.
Merci d'avance.
Ubuntu-Unity 24.04 Alienware X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42
Hors ligne
#2 Le 16/05/2019, à 15:40
- Hoper
Re : Récuper partie de nom de fichier pour l'écrire dans fichier
Donc on résumé...
Tu as une série de fichiers qui se nomme soient :
- XX_YYY.txt
- YYY.txt
Question 1 : C'est toujours exactement comme ça ? Le numéro, si il est présent est toujours sur deux digits ? Le nom à une taille variable ou c'est toujours 3 caractères et une extension ?
Question 2 : Il faut ajouter le nom a la fin de la première ligne, il faut aussi ajouter un espace après ce qui se trouve déjà sur cette ligne ou il est déjà présent ?
Question 3 : Cette première ligne, son contenu d'origine à une taille fixe ou une taille variable ?
Avec ces infos je pourrai surement coder un truc vite fait
Mes tutos et coups de gueule :
http://hoper.dnsalias.net/atdc/
Mastodon: @hoper@framapiaf.org
Hors ligne
#3 Le 16/05/2019, à 15:55
- L'Africain
Re : Récuper partie de nom de fichier pour l'écrire dans fichier
Question 1 : C'est toujours exactement comme ça ? Le numéro, si il est présent est toujours sur deux digits ? Le nom à une taille variable ou c'est toujours 3 caractères et une extension ?
Toujours 2 digits et 3 caractères avec une extension.
Question 2 : Il faut ajouter le nom a la fin de la première ligne, il faut aussi ajouter un espace après ce qui se trouve déjà sur cette ligne ou il est déjà présent ?
Non l'espace est déjà là.
Question 3 : Cette première ligne, son contenu d'origine à une taille fixe ou une taille variable ?
Taille fixe, il ne change pas, c'est toujours \id. Id en fait c'est identity.
Ubuntu-Unity 24.04 Alienware X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42
Hors ligne
#4 Le 16/05/2019, à 15:58
- Hoper
Re : Récuper partie de nom de fichier pour l'écrire dans fichier
Ok je regarde... Soit ce soir soit demain matin
Mes tutos et coups de gueule :
http://hoper.dnsalias.net/atdc/
Mastodon: @hoper@framapiaf.org
Hors ligne
#5 Le 16/05/2019, à 15:59
- L'Africain
Re : Récuper partie de nom de fichier pour l'écrire dans fichier
Ok merci!
Ubuntu-Unity 24.04 Alienware X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42
Hors ligne
#6 Le 16/05/2019, à 16:07
- Hoper
Re : Récuper partie de nom de fichier pour l'écrire dans fichier
En fait, j'ai une dernière question :
Tous les fichiers à modifier ils seront dans un même répertoire et il n'y a qu'eux, ou est ce qu'ils sont "mélangés" avec des fichiers qu'il ne faut pas modifier ?
Mes tutos et coups de gueule :
http://hoper.dnsalias.net/atdc/
Mastodon: @hoper@framapiaf.org
Hors ligne
#7 Le 16/05/2019, à 16:24
- L'Africain
Re : Récuper partie de nom de fichier pour l'écrire dans fichier
Même répertoire.
Ubuntu-Unity 24.04 Alienware X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42
Hors ligne
#8 Le 16/05/2019, à 16:26
- Hoper
Re : Récuper partie de nom de fichier pour l'écrire dans fichier
Bon bein... Voila... Tu indique un répertoire à ce script et TOUS les fichiers à l’intérieur seront modifiés (donc il faut être sur hein...)
#!/bin/bash
if [ $# -ne 1 ]
then
echo "Syntaxe : $0 repertoire (exemple : $0 /data )"
exit 1
fi
if [ ! -d "$1" ]
then
echo "$1 n'est pas un repertoire..."
exit 1
fi
############################################
IFS='
'
for i in `ls -1 "$1"`
do
echo "Fichier : $i"
NAME=`echo "$i" | cut -d '_' -f2 | cut -d '.' -f1`
sed -i "1s/$/$NAME/" "$1/$i"
done
Mes tutos et coups de gueule :
http://hoper.dnsalias.net/atdc/
Mastodon: @hoper@framapiaf.org
Hors ligne
#9 Le 16/05/2019, à 17:26
- L'Africain
Re : Récuper partie de nom de fichier pour l'écrire dans fichier
Ça semble bien fonctionner merci!
Dernière modification par L'Africain (Le 16/05/2019, à 17:30)
Ubuntu-Unity 24.04 Alienware X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42
Hors ligne
#10 Le 16/05/2019, à 18:14
- kholo
Re : Récuper partie de nom de fichier pour l'écrire dans fichier
salut,
sans vouloir faire le rabat-joie les quottes inversées sont dépréciées ; utiliser $( fonction ) à la place
et à la place de
IF='
'
utiliser
IF=$'\n'
ça fait plus classe !
quant à
for i in `ls -1 "$1"`
ça c'est pas beau !
soit tu fais un cd pour entrer dans le répertoire et tu crées une recherche propre ou il y a certainement d'autre solutions
... et
NAME=`echo "$i" | cut -d '_' -f2 | cut -d '.' -f1`
le premier cut peut lire le fichier et éviter le echo non ?
rhooo, faut que je me remette un peu au bash pour garder ma tête !!!
Hors ligne
#11 Le 17/05/2019, à 06:32
- Hoper
Re : Récuper partie de nom de fichier pour l'écrire dans fichier
Les "ça fait pas beau" sont un peu subjectifs. Et personnellement je privilégierai toujours la compatibilité a tout le reste. (Les quotes inversées fonctionneront sur n'importe quel unix par exemple)
Pour la dernière remarque je suis d'accord.
Après l'optimisation a ce niveau là... La simplicité et la lisibilité'du code ça compte aussi...
Mes tutos et coups de gueule :
http://hoper.dnsalias.net/atdc/
Mastodon: @hoper@framapiaf.org
Hors ligne
#12 Le 17/05/2019, à 06:47
- Watael
Re : Récuper partie de nom de fichier pour l'écrire dans fichier
c'est pas beau, c'est périlleux, et c'est inutile* :
for f in "$rep"/*; do filename="${f##*_}"; filename="${filename%.*}"; sed -i '1s/$/'"${filename^^}"'/' "$f"; done
au nom de la lisibilité et de la simplicité, on pourrait ne pas utiliser sed ?
* pour faire court, c'est kkloug.
Dernière modification par Watael (Le 17/05/2019, à 06:52)
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#13 Le 17/05/2019, à 07:20
- L'Africain
Re : Récuper partie de nom de fichier pour l'écrire dans fichier
Merci à vous deux! Vous pourriez juste m'expliquer le boulot des commandes? Si je comprends, alors je serais capable d'adapter la commande à d'autres cas.
Merci!
Ubuntu-Unity 24.04 Alienware X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42
Hors ligne
#14 Le 17/05/2019, à 07:38
- Watael
Re : Récuper partie de nom de fichier pour l'écrire dans fichier
en ce qui me concerne, tout est dans le man bash
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#15 Le 17/05/2019, à 08:08
- L'Africain
Re : Récuper partie de nom de fichier pour l'écrire dans fichier
@Watael, quand j'exécute ta commande j'ai cette erreur:
sed: expression -e #1, caractère 7: option de `s' inconnue
Je l'ajouter à une partie du script de Hoper?
Ubuntu-Unity 24.04 Alienware X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42
Hors ligne
#16 Le 17/05/2019, à 08:15
- Watael
Re : Récuper partie de nom de fichier pour l'écrire dans fichier
ça remplace sa boucle for
ajoute un echo devant le sed :
echo sed -i '1s/$/'"${filename^^}"'/' "$f"; done
je suspecte un / de ne pas avoir été supprimé
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#17 Le 17/05/2019, à 08:24
- kholo
Re : Récuper partie de nom de fichier pour l'écrire dans fichier
@Hoper : désolé mon but n'était pas de te froisser... respect.
@l'Africain : j'ai tenté de reprendre des utilisations et liens utiles dans un de mes fils
en plus d'exemples, ya des liens et explications dont le man bash, la doc ini, l'abs,...
... et, c'est quoi que tu n'arrives pas à comprendre dans ce script ?
certainement le sed
Hors ligne
#18 Le 17/05/2019, à 08:28
- Hoper
Re : Récuper partie de nom de fichier pour l'écrire dans fichier
c'est pas beau, c'est périlleux, et c'est inutile* :
for f in "$rep"/*; do filename="${f##*_}"; filename="${filename%.*}"; sed -i '1s/$/'"${filename^^}"'/' "$f"; done
au nom de la lisibilité et de la simplicité, on pourrait ne pas utiliser sed ?
* pour faire court, c'est kkloug.
Alors la par contre, tu vois, c'est ça que je trouve vraiment, mais alors vraiment très moche. Et j'en suis sur beaucoup plus problématique que ce que j'ai écris. Déjà parce que tu utilise une étoile, donc la complétion du shell... Donc tu es limité par une taille d'une ligne de commande... il se passera quoi si il y a 100.000 fichiers dans le répertoire ?
Bref, vous etes tous gentil mais en ce qui me concerne la discussion est close. Ma proposition n'est sûrement pas parfaite, mais elle fonctionne et me semble bien plus robuste que ce genre de chose... Je vous laisse vous battre entre vous si ça vous amuse. Bonne journée
Mes tutos et coups de gueule :
http://hoper.dnsalias.net/atdc/
Mastodon: @hoper@framapiaf.org
Hors ligne
#19 Le 17/05/2019, à 08:47
- Watael
Re : Récuper partie de nom de fichier pour l'écrire dans fichier
@Hoper : désolé mon but n'était pas de te froisser...
ah ? moi, je m'en fous de froisser des gens qui ne veulent pas coder correctement.
avec 100000 fichiers dans le répertoire, il se passera la même chose qu'avec une substitution de commande faisant appel à ls : le nombre d'arguments passés à for sera au moins égal, au pire supérieur.
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#20 Le 17/05/2019, à 09:01
- kholo
Re : Récuper partie de nom de fichier pour l'écrire dans fichier
@watael : oui respect aux anciens... et j'ai pas ton expérience et ta connaissance...
après on est d'accord ou pas... j'ai pas encore assez de bouteille pour me fixer sur des certitudes...
bon, tentons de rendre à César ce qui appartient à Jules
pour les backtick une discussion ici donne des infos et liens : c'est mitigé
pour le parse ls on peut en discuter à partir de cette page... mais je trouve ça lourdingue...
de ma page de discussion j'aime bien le While ... < < ...
$ touch "one file" $ touch "second file edsfs" $ ls one file second file edsfs $ ls -1 one file second file edsfs $ for f in $(ls -1); do echo "\"$f\""; done "one" "file" "second" "file" "edsfs" $ while read f; do echo "\"$f\""; done < <(ls -1) "one file" "second file edsfs"
pour la bascule du IFS, à mon sens, c'est surtout une question esthétique... dans les deux cas ça marche pas avec des sauts de lignes dans les noms de fichiers (heureusement très rare !)
quant au sed, je suis nul...
Hors ligne
#21 Le 17/05/2019, à 09:08
- Hoper
Re : Récuper partie de nom de fichier pour l'écrire dans fichier
@Watael
J'ai signalé ton message aux admins. Quelque soit la "vérité technique" (mon expérience me dit que tu as tord, mais j'ai vraiment autre chose à faire qu'a essayer de le prouver la maintenant). Ce qui me semble vraiment gênant c'est ton attitude méprisante et agressive envers des personnes qui essayent simplement de donner un coup de main.
Si il faut absolument être le meilleur du monde sur un sujet pour pouvoir répondre sans se faire insulter "Ton code c'est de la merde et j'en ai rien a foutre si ça te froisse que je dise ça", ce forum va vite devenir vide et inutile. Merci de ne pas dégrader l'ambiance d'un forum d'entraide ou la majorité des gens sont des débutants qui aident d'autres débutants.
Essaye d'en tenir compte dans tes prochaines interventions...
Mes tutos et coups de gueule :
http://hoper.dnsalias.net/atdc/
Mastodon: @hoper@framapiaf.org
Hors ligne
#22 Le 17/05/2019, à 09:25
- Watael
Re : Récuper partie de nom de fichier pour l'écrire dans fichier
while read f; do echo "\"$f\""; done < <(ls -1)
mouais, mais bon, c'est s'embêter, alors que for f in ./*; do ...; done, c'est direct.
ps: quel que soit la date de délivrance du permis de conduire, celui qui met en péril les autres utilisateurs de la route doit être verbaliser; au minimum (verbaliser).
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#23 Le 17/05/2019, à 09:59
- kholo
Re : Récuper partie de nom de fichier pour l'écrire dans fichier
ah, moi je sais po,
c'est un participant du nom de Watael qui m'a refilé le tuyau d'injecter par le cul d'un while read do done à de nombreuses reprises
pour clore ce qui semble se transformer en une guerre d'égo, la vérité se passe sur le terrain...
si le script de Hoper suffit à l'Africain c'est le principal... et en cas de soucis ya assez de matière pour adapter.
Non ?
allez... faites vous la bises et on passe à autre chose...
Hors ligne
#24 Le 17/05/2019, à 11:50
- LeoMajor
Re : Récuper partie de nom de fichier pour l'écrire dans fichier
bonjour,
tu utilises detox pour sécuriser les noms de fichiers et voilà ... Cela fait longtemps que je l'utilise, et si ma mémoire est bonne, @Hoper aussi.
touch "ခမညျးတျောခရစ္စမတ် (1980 ခုနှစ်ဒီဇင်ဘာလက) junk ဖြစ်ပါသည်:Père Noël.mp4"
detox "ခမညျးတျောခရစ္စမတ် (1980 ခုနှစ်ဒီဇင်ဘာလက) junk ဖြစ်ပါသည်:Père Noël.mp4"
ls *
1980-junk_Pere_Noel.mp4
-----------------
injection stdin à partir d'une variable i
NAME=$({ cut -d '_' -f2 | cut -d '.' -f1; } <<<"$i")
... à partir d'une commande
... < <(commande arg1 ...)
Hors ligne
#25 Le 17/05/2019, à 12:23
- Watael
Re : Récuper partie de nom de fichier pour l'écrire dans fichier
c'est un participant du nom de Watael qui m'a refilé le tuyau d'injecter par le cul d'un while read do done à de nombreuses reprises
ouais, non, mais il y connaît rien.
je ne proposerai JAMAIS de parser la sortie d'un ls, parce que c'est totalement oblitéré dans ma mémoire.
par contre, un find, ou d'autres commandes dont on veut lire la sortie ligne par ligne, oui, bien sûr, il peut être profitable de l'enfiler par derrière.
mais JAMAIS ls.
les personnes expérimentées sont censées promouvoir les bonnes pratiques; parser la sortie de ls (sauf rares exceptions) n'en fait pas partie.
Connected \o/
Welcome to sHell. · eval is evil.
En ligne