Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/06/2011, 15h36   #1
Membre du Club
 
Inscription : juillet 2006
Messages : 166
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 166
Points : 61
Points : 61
Par défaut [bash] découper un fichier -> agir sur un fichier dés qu'il est achevé

Bonjour.

split fonctionne très bien pour le découpage de fichiers, mais pour autant que je sache il ne permet pas de travailler sur un fichier découpé dés qu'il a été achevé, mais seulement quand tous les fichiers ont été achevés (du moins l'emploi d'un pipeline | ne semble pas avoir d'effet).
Je vois bien une solution alternative mais c'est clairement du bricolage et imprécis :

Après avoir lancé la découpe lancer un sous-shell parallèle qui se composerait d'une boucle avec un sleep (probablement d'une seconde) et qui vérifierait l'existence et la taille d'un fragment de fichier, si la taille étant celle désirée alors ce fichier a fini d'être construit et on peut travailler dessus (emploi de stat pour obtenir la taille du fichier).
(je veux faire un md5sum sur chaque fichier découpé).

Y'a t'il un meilleur moyen que cette approximation ?
Peut être avec cut, mais dans ce cas ne serait ce pas trop l'usine à gaz en terme de performances et ressources utilisées comparé à l'emploi de split et la méthode que je décris (sachant que les fichiers peuvent faire plusieurs giga octets) ?

Ah et aussi existe t'il un moyen d'ordonner à split de commencer avec l'indice 1, plutôt que 0 pour les suffixes de fichier ? (même si on peut éventuellement renommer les fichiers, autant le faire à la création)

Par contre la solution que j'ai en tête n'est "viable" que pour les fichiers volumineux, pour les petits fichiers le temps de découpe serait très faible, mais bon je peux gérer cela manuellement avec une condition, pour de tels fichiers un md5sum lancé à chaque fin de création de fichier serait superflu, voir même "néfaste" pour les performances.
AnozerOne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 16h29   #2
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Salut,

Une solution parmi d'autres sûrement...

L'idée c'est d'utiliser la sortie verbeuse de split (--verbose) afin d'en extraire le nom de chaque fichier généré au fur et à mesure de sa création (selon le man de split "--verbose print a diagnostic just before each output file is opened") et de passer ce dernier à md5sum via la lecture de la sortie standard.

Démonstration :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
$ ls -lh
total 13M                
-rw-r--r-- 1 jp jp 13M 2011-06-17 15:52 plop

$ wc -l plop 
1000000 plop                  

$ while read i;do md5sum "${i//[^x[:digit:]]/}" > ${i//[^x[:digit:]]/}.md5 ; done < <(split -d -l 100000 --verbose plop)

$ ls -lh
total 25M                
-rw-r--r-- 1 jp jp  13M 2011-06-17 15:52 plop
-rw-r--r-- 1 jp jp 1,2M 2011-06-17 16:22 x00 
-rw-r--r-- 1 jp jp   38 2011-06-17 16:22 x00.md5
-rw-r--r-- 1 jp jp 1,3M 2011-06-17 16:22 x01    
-rw-r--r-- 1 jp jp   38 2011-06-17 16:22 x01.md5
-rw-r--r-- 1 jp jp 1,3M 2011-06-17 16:22 x02    
-rw-r--r-- 1 jp jp   38 2011-06-17 16:22 x02.md5
-rw-r--r-- 1 jp jp 1,3M 2011-06-17 16:22 x03
-rw-r--r-- 1 jp jp   38 2011-06-17 16:22 x03.md5
-rw-r--r-- 1 jp jp 1,3M 2011-06-17 16:22 x04
-rw-r--r-- 1 jp jp   38 2011-06-17 16:22 x04.md5
-rw-r--r-- 1 jp jp 1,3M 2011-06-17 16:22 x05
-rw-r--r-- 1 jp jp   38 2011-06-17 16:22 x05.md5
-rw-r--r-- 1 jp jp 1,3M 2011-06-17 16:22 x06
-rw-r--r-- 1 jp jp   38 2011-06-17 16:22 x06.md5
-rw-r--r-- 1 jp jp 1,3M 2011-06-17 16:22 x07
-rw-r--r-- 1 jp jp   38 2011-06-17 16:22 x07.md5
-rw-r--r-- 1 jp jp 1,3M 2011-06-17 16:22 x08
-rw-r--r-- 1 jp jp   38 2011-06-17 16:22 x08.md5
-rw-r--r-- 1 jp jp 1,3M 2011-06-17 16:22 x09
-rw-r--r-- 1 jp jp   38 2011-06-17 16:22 x09.md5

$ md5sum -c x0*.md5
x00: OK
x01: OK
x02: OK
x03: OK
x04: OK
x05: OK
x06: OK
x07: OK
x08: OK
x09: OK

$
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 17/06/2011, 16h56   #3
Membre du Club
 
Inscription : juillet 2006
Messages : 166
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 166
Points : 61
Points : 61
Déjà merci pour ton script.

Par contre je n'y comprends pas grand chose

Je comprendrais l'écriture ésotérique propre au bash en me tapant le man, mais là ou je bloque vraiment c'est à la double redirection :

Code :
done < <(split -d -l 100000 --verbose plop)
Cela veut dire quoi ? (à moins que l'espace entre les 2 < n'est pas pris en compte, dans ce cas je "comprendrais")

Plutôt que spammer la sortie standard y'a moyen d'extraire le nom du fichier et de rediriger vers > dev/null (je ne me rappelle plus la syntaxe exacte) ?
AnozerOne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 17h13   #4
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Citation:
Envoyé par AnozerOne Voir le message
Je comprendrais l'écriture ésotérique propre au bash en me tapant le man, mais là ou je bloque vraiment c'est à la double redirection :

Code :
done < <(split -d -l 100000 --verbose plop)
Ce n'est pas une double redirection comme tu le dis et le penses, mais juste la forme syntaxique d'une redirection de commande (ou d'un processus plus exactement).

Citation:
Cela veut dire quoi ? (à moins que l'espace entre les 2 < n'est pas pris en compte, dans ce cas je "comprendrais")
La syntaxe est la suivante, avec un espace entre les 2 chevrons :
Citation:
Plutôt que spammer la sortie standard y'a moyen d'extraire le nom du fichier et de rediriger vers > dev/null (je ne me rappelle plus la syntaxe exacte) ?
Euh... chez moi la sortie standard n'est pas spammée
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 17/06/2011, 17h31   #5
Membre du Club
 
Inscription : juillet 2006
Messages : 166
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 166
Points : 61
Points : 61
Au temps pour moi, j'avais pas testé le script et pas vu le ls (double faute).

Bon bah du coup je ne pense pas qu'il y ait une meilleure solution que la tienne

A moins que peut être en se passant de split et utilisant cat directement, reste la question du résultat au niveau des ressources utilisées et des performances obtenues. (sachant qu'il ne s'agit pas de fichiers textes)

Une idée à ce sujet ?
Je veux dire est que ça vaut le coup que j'essaye ou vous savez d'or et déjà que cela sera moins performant que cette solution ?
AnozerOne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 20h31   #6
Membre du Club
 
Inscription : juillet 2006
Messages : 166
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 166
Points : 61
Points : 61
Je me suis rendu compte que cette méthode est horriblement inefficace (un md5 sur chaque fichier même si le md5 précédent n'est pas achevé, tout en continuant la découpe). Mon processeur en pleure encore.

Je vais vraisemblablement utiliser dd plutôt, me permettant ainsi de gérer les md5sum avec une file d'attente.
De toute façon je devrais renommer les fichiers créés par split, car il ne permet pas pour les suffixes de commencer par 1 au lieu de 0. (choix personnel plus human-friendly)

Merci en tout cas de ces réponses qui m'ont fait grimper quelques échelons sur la voie de la connaissance absolue.
AnozerOne est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h11.


 
 
 
 
Partenaires

Hébergement Web