#1 Le 13/04/2017, à 14:16
- Beuhlet_Reseau
Redirection fichier boucle "while read"
Hello,
I have a question
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, à 14: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, à 15: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, à 15:55)
Hors ligne
#4 Le 13/04/2017, à 16: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, à 16:02)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#5 Le 13/04/2017, à 17:01
- Hizoka
Re : Redirection fichier boucle "while read"
Hoper => mauvaise idée ce for avec ls
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#6 Le 14/04/2017, à 08: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
Mes tutos et coups de gueule :
http://hoper.dnsalias.net/atdc/
Mastodon: @hoper@framapiaf.org
Hors ligne
#7 Le 14/04/2017, à 13: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, à 16:46
- Beuhlet_Reseau
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
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, à 18: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, à 18:42)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne