Contenu | Rechercher | Menus

Annonce

Ubuntu-fr vend de superbes t-shirts et de belles clés USB 32Go
Rendez-vous sur la boutique En Vente Libre

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 16/05/2019, à 12: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 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#2 Le 16/05/2019, à 16: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 smile


Mes tutos et coups de gueule :
http://hoper.dnsalias.net/atdc/
Mastodon: @hoper@framapiaf.org

Hors ligne

#3 Le 16/05/2019, à 16: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 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#4 Le 16/05/2019, à 16:58

Hoper

Re : Récuper partie de nom de fichier pour l'écrire dans fichier

Ok je regarde... Soit ce soir soit demain matin smile


Mes tutos et coups de gueule :
http://hoper.dnsalias.net/atdc/
Mastodon: @hoper@framapiaf.org

Hors ligne

#5 Le 16/05/2019, à 16:59

L'Africain

Re : Récuper partie de nom de fichier pour l'écrire dans fichier

Ok merci!


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#6 Le 16/05/2019, à 17: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, à 17:24

L'Africain

Re : Récuper partie de nom de fichier pour l'écrire dans fichier

Même répertoire.


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#8 Le 16/05/2019, à 17: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, à 18: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, à 18:30)


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#10 Le 16/05/2019, à 19: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, à 07: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, à 07: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, à 07:52)


eval, c'est mal.

Hors ligne

#13 Le 17/05/2019, à 08: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 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#14 Le 17/05/2019, à 08: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


eval, c'est mal.

Hors ligne

#15 Le 17/05/2019, à 09: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 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#16 Le 17/05/2019, à 09: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é


eval, c'est mal.

Hors ligne

#17 Le 17/05/2019, à 09: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, à 09:28

Hoper

Re : Récuper partie de nom de fichier pour l'écrire dans fichier

Watael a écrit :

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 smile


Mes tutos et coups de gueule :
http://hoper.dnsalias.net/atdc/
Mastodon: @hoper@framapiaf.org

Hors ligne

#19 Le 17/05/2019, à 09:47

Watael

Re : Récuper partie de nom de fichier pour l'écrire dans fichier

kholo a écrit :

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


eval, c'est mal.

Hors ligne

#20 Le 17/05/2019, à 10: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 ... < < ...

la page a écrit :
$ 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... lol

Hors ligne

#21 Le 17/05/2019, à 10: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, à 10:25

Watael

Re : Récuper partie de nom de fichier pour l'écrire dans fichier

kholo a écrit :
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).


eval, c'est mal.

Hors ligne

#23 Le 17/05/2019, à 10: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 wink
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, à 12: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, à 13:23

Watael

Re : Récuper partie de nom de fichier pour l'écrire dans fichier

kholo a écrit :

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

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

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.


eval, c'est mal.

Hors ligne