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 13/04/2017, à 15:16

Beuhlet_Reseau

Redirection fichier boucle "while read"

Hello,

I have a question smile

Je souhaite lire les fichiers contenu dans un répertoire, y faire un léger traitement et écrire les fichiers dans un autre répertoire.

Mon but est le suivant :
- J'ai 4 fichier comportant quelques milliers de lignes dans un répertoire "tmp"
- Je veux en sortie ces mêmes 4 fichiers avec les champs voulus dans un autre répertoire "work"

Pour le moment j'ai ceci qui fonctionne :

destinatation_tmp="/home/tmp"
destination_finale="/home/work"

ls -f $destinatation_tmp | while read -r file; do cut -d',' -f1,2,3,4,5,6,7,8,9,10,12,20,21,31,32,33,35,36,37 ${file} ; done

Mais quand je souhaite rediriger cela ne fonctionne pas :

ls -f $destinatation_tmp | while read -r file; do cut -d',' -f1,2,3,4,5,6,7,8,9,10,12,20,21,31,32,33,35,36,37 ${file} ; done > $destination_finale$file

L'avenir appartient à ceux qui se lèvent tôt... Pas ceux qui crachent trop (vite?).

Hors ligne

#2 Le 13/04/2017, à 15:37

Hoper

Re : Redirection fichier boucle "while read"

Essaye plutôt un truc comme ça:

for fic in `ls -1 /home/tmp`; do cut -d ',' -f1,2,... $fic > /home/work/$fic; done

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

Hors ligne

#3 Le 13/04/2017, à 16:53

pingouinux

Re : Redirection fichier boucle "while read"

Bonjour,
Je ferais ceci :

for file in "$destinatation_tmp"/*; do [ -f "$file" ] && cut -d',' -f1-10,12,20-21,31-33,35-37 "$file"  >"$destination_finale/${file##*/}"; done

Ajouté : Test pour ne traiter que les fichiers

Dernière modification par pingouinux (Le 13/04/2017, à 16:55)

Hors ligne

#4 Le 13/04/2017, à 17:01

Watael

Re : Redirection fichier boucle "while read"

eh, oui. parcourir la sortie d'une substitution de commande avec une boucle for est connu pour ne pas être une bonne pratique, car for coupe cette sortie en mots, et pas en lignes.

la seule manière d'intégrer une protection contre quelque motif que ce soit qui introduirait une séparation dans le nom d'un fichier est de laisser faire le shell en utilisant le Développement des chemins (globbing), comme le montre pingouinux.

on pourrait ajouter un test pour être sûr de ne traiter que des fichiers. (edit: ça a été fait depuis que j'ai commencé ce message.)

Dernière modification par Watael (Le 13/04/2017, à 17:02)


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

Hors ligne

#5 Le 13/04/2017, à 18:01

Hizoka

Re : Redirection fichier boucle "while read"

Hoper => mauvaise idée ce for avec ls hmm


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

Hors ligne

#6 Le 14/04/2017, à 09:35

Hoper

Re : Redirection fichier boucle "while read"

Oui le problème des espaces dans les noms... Un oubli désolé (mais en meme temps mettre des espaces dans les nom... bref)

Je maintiens le for et le ls en modifiant la variable IFS juste avant pour mettre un saut de ligne dedans smile


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

Hors ligne

#7 Le 14/04/2017, à 14:15

Watael

Re : Redirection fichier boucle "while read"

les noms de fichiers peuvent aussi contenir des sauts de ligne !


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

Hors ligne

#8 Le 18/04/2017, à 17:46

Beuhlet_Reseau

Re : Redirection fichier boucle "while read"

pingouinux a écrit :

Bonjour,
Je ferais ceci :

for file in "$destinatation_tmp"/*; do [ -f "$file" ] && cut -d',' -f1-10,12,20-21,31-33,35-37 "$file"  >"$destination_finale/${file##*/}"; done

Ajouté : Test pour ne traiter que les fichiers


Tout d'abord merci à tous pour votre aide.

Sur ces parties :

"$destinatation_tmp"/*   (On ne doit pas englober totalement l'ensemble genre "$destinatation_tmp/*" ?)

do [ -f "$file" ]  : On regarde juste si le fichier existe ?

"$destination_finale/${file##*/}"  :  La tu m'a complètement perdu ^^

En tout cas merci


L'avenir appartient à ceux qui se lèvent tôt... Pas ceux qui crachent trop (vite?).

Hors ligne

#9 Le 18/04/2017, à 19:39

Hizoka

Re : Redirection fichier boucle "while read"

"$destinatation_tmp"/*   (On ne doit pas englober totalement l'ensemble genre "$destinatation_tmp/*" ?)

Essaie et tu verras que le résultat n'est pas le même

for file in "$destinatation_tmp"/*
do
echo "$file"
done

for file in "$destinatation_tmp/*"
do
echo "$file"
done

do [ -f "$file" ]  : On regarde juste si le fichier existe ?

Ca teste l’élément pour voir si c'est un fichier.
https://abs.traduc.org/abs-fr/ch07s02.html

"$destination_finale/${file##*/}"  :  La tu m'a complètement perdu ^^

un petit test :

file="/home/hizoka/dossier/fichier.ext"
echo  "${file##*/}"

https://abs.traduc.org/abs-fr/ch10.html

Dernière modification par Hizoka (Le 18/04/2017, à 19:42)


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

Hors ligne