IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

[bash] découper un fichier -> agir sur un fichier dés qu'il est achevé


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 172
    Points : 99
    Points
    99
    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.

  2. #2
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 172
    Points : 99
    Points
    99
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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) ?

  4. #4
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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).

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

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 172
    Points : 99
    Points
    99
    Par défaut
    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 ?

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 172
    Points : 99
    Points
    99
    Par défaut
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Application pointant sur un fichier ics placé sur mon serveur
    Par Général03 dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 29/07/2015, 21h23
  2. [XL-2010] Extraire le contenu de ces fichiers txt automatiquement, sur un fichier Excel
    Par cybermig dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 24/06/2014, 20h07
  3. Réponses: 0
    Dernier message: 07/10/2009, 11h38
  4. [XL-2007] Macro fonctionnant sur un fichier et pas sur l'autre
    Par Fouinette85 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 30/04/2009, 17h29
  5. Réponses: 1
    Dernier message: 27/10/2007, 10h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo