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 :

La commande find ne retourne pas tous les fichiers


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mars 2007
    Messages : 616
    Points : 556
    Points
    556
    Par défaut La commande find ne retourne pas tous les fichiers
    J'ai un script bash suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    while true 
    do
    	sleep "0.5"
    	lines=`find /tmp -newer $startWith -regex ".*extract-result-[0-9]+\.xml" -printf "%T@|%p\n" 2> /dev/null | sort -n`
    	echo `date "+%Y-%m-%d %H:%M:%S"` DEBUG - $lines
    	for line in $lines 
    	do
    	  startWith=`echo $line| cut -f2 -d "|"`
    	  dealWith "$startWith"
    	done
    done
    La fonction dealWith, copie le fichier en fonction de son contenu

    Le problème est que la commande find ne me retourne pas tous les fichiers dans le script:
    Voici un bout de ce que me renvoie la commande echo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    2016-05-09 00:11:09 DEBUG - 1462745467.6513636820|/tmp/extract-result-352380.xml 1462745467.6923636820|/tmp/extract-result-352381.xml 1462745467.7913636820|/tmp/extract-result-352382.xml 1462745467.9253636820|/tmp/extract-result-352383.xml 1462745468.0803636820|/tmp/extract-result-352384.xml 1462745468.1163636820|/tmp/extract-result-352385.xml 1462745468.2243636820|/tmp/extract-result-352386.xml 1462745468.3203636820|/tmp/extract-result-352387.xml 1462745468.3743636820|/tmp/extract-result-352388.xml 1462745468.4253636820|/tmp/extract-result-352389.xml 1462745468.4733636820|/tmp/extract-result-352390.xml 1462745468.7943636800|/tmp/extract-result-352391.xml 1462745468.7963636800|/tmp/extract-result-352392.xml 1462745469.0013636800|/tmp/extract-result-352395.xml
    il manque les fichiers 352393 et 352394.


    Et voici ce que maintenant retourne la commande là : find /tmp -newer extract-result-352379.xml -regex ".*extract-result-[0-9]+\.xml" -printf "%T@|%p\n" 2> /dev/null | sort -n | head -20
    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
     
    1462745467.6513636820|/tmp/extract-result-352380.xml
    1462745467.6923636820|/tmp/extract-result-352381.xml
    1462745467.7913636820|/tmp/extract-result-352382.xml
    1462745467.9253636820|/tmp/extract-result-352383.xml
    1462745468.0803636820|/tmp/extract-result-352384.xml
    1462745468.1163636820|/tmp/extract-result-352385.xml
    1462745468.2243636820|/tmp/extract-result-352386.xml
    1462745468.3203636820|/tmp/extract-result-352387.xml
    1462745468.3743636820|/tmp/extract-result-352388.xml
    1462745468.4253636820|/tmp/extract-result-352389.xml
    1462745468.4733636820|/tmp/extract-result-352390.xml
    1462745468.7943636800|/tmp/extract-result-352391.xml
    1462745468.7963636800|/tmp/extract-result-352392.xml
    1462745468.9813636800|/tmp/extract-result-352393.xml
    1462745468.9963636800|/tmp/extract-result-352394.xml
    1462745469.0013636800|/tmp/extract-result-352395.xml
    1462745469.0313636800|/tmp/extract-result-352396.xml
    1462745469.1863636800|/tmp/extract-result-352397.xml
    1462745469.3503636800|/tmp/extract-result-352398.xml
    1462745469.5493636800|/tmp/extract-result-352399.xml
    Est ce que vous savez d'où peut venir le problème et que faire?

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mai 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2016
    Messages : 12
    Points : 36
    Points
    36
    Par défaut quelques idées
    Bonjour,
    J'ai examiné ton code, et je n'ai pas compris pourquoi ces deux seuls fichiers ne sont pas récupérés par le find.

    Seul le cut (ligne 8) me semble suspect: en prenant le 2eme champ separé par des '|',la variable startWith contient un nom de fichier + un linefeed (remplacé par un espace?) + la date du fichier suivant. Est-ce que cela suffit à faire échouer le find de l'itération qui suit? (il faudrait rediriger le standard-error du find vers un autre fichier, et examiner celui-ci à chaque itération)

    La variable startWith est-elle initialisée avant la 1ère itération?

    Je n'ai encore jamais utilisé la commande sleep avec un paramètre fractionnaire. Il me semble me souvenir, qu'il y a longtemps (avec de vieux Unix), sleep "arrondissait" les délais pour rendre la main à une date "entière" (en secondes). Se pourrait-il qu'il y ait un effet pervers de ce type: les deux fichiers manquants sont juste avant une date "entière" (mais alors le fichier 352383 devrait être dans le même cas...)

    Il y a encore une chose qui m'étonne avec la variable startWith: à la ligne 8 elle est affectée par le nom du fichier le plus ancien de la liste $lines. Est-ce qu'à l'itération suivante, lines ne se retrouve pas mentionner les mêmes fichiers ( + d'autres plus récents) qui ont déjà été traités par dealWith à la ligne 9 ? Est-ce voulu?

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mars 2007
    Messages : 616
    Points : 556
    Points
    556
    Par défaut
    En faite, les fichiers manquants apparaissent de temps en temps. Ce n'est pas régulier. J'ai une application qui me crée entre 600 et 800 fichiers xml / minute et sur environs 20000 fichiers générés une vingtaine se perdent dans cette boucle.
    Je n'ai pas mis le script complet mais la variable startWith est bien initialisée au début.
    La commande echo me retourne le résultat de la commande find, mais si la commande find ne trouve pas certains fichiers qui sont censés y être, je ne sais pas quoi faire.

    Le problème vient peut être de l'écriture différée ?

  4. #4
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    les fichiers qui n'apparaissent pas ont des noms particuliers ? typiquement find est sensible à la locale utilisée, j'ai déjà eu le cas où des fichiers contenant des caractères utf-8 étaient purement et simplement ignorés alors qu'ils contenaient le pattern voulu, ça peut être une piste de réflexion

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mars 2007
    Messages : 616
    Points : 556
    Points
    556
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    salut,

    les fichiers qui n'apparaissent pas ont des noms particuliers ? typiquement find est sensible à la locale utilisée, j'ai déjà eu le cas où des fichiers contenant des caractères utf-8 étaient purement et simplement ignorés alors qu'ils contenaient le pattern voulu, ça peut être une piste de réflexion
    Non, ça n'a rien a voir, car la même commande exécutée plus tard me retourne bien tous les fichiers. De plus les noms sont tous identiques, seuls les numéros changent.
    Je soupçonne fortement le fait que, comme les fichiers n'ont pas tous la même taille, certains fichiers mettent du temps à s’écrire sur le disque et il se peut que certains fichiers plus petits soient déjà écrit (extract-result-352395.xml) et find les trouve, tandis que les plus gros ne sont pas encore totalement écrits et donc restent introuvables (extract-result-352393.xml et extract-result-352394.xml)

  6. #6
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Bonjour,

    Sur quel type de système de fichier écris-tu tes fichiers ?

    Ne serais-tu pas sur du NFS ?

    Selon moi, si à la place du sleep 0.5, tu fais un sync pour flusher les caches disque, cela devrait résoudre ton problème de fichier raté et c'est moins au petit bonheur la chance que ce dire je vais attendre une demi-seconde.
    Cordialement.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mai 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2016
    Messages : 12
    Points : 36
    Points
    36
    Par défaut
    À chaque itération startWith récupère le plus ancien des fichiers trouvés par find (puisque le sort trie par date croissante). Le find suivant trouve tous les fichiers plus récents que le plus ancien de tous les fichiers existants, (c'est à dire tous sauf ceux qui auraient pu être renommés ou déplacés ou détruits par dealWith). Peux-tu nous dire ce que fait la commande dealWith? Es-tu sûr que la liste des fichiers à traiter doive grossir indéfiniment? startWith ne devrait-il pas recevoir le nom du fichier le plus récemment traité pour qu'au tour suivant dealWith ne s'occupe que des derniers fichiers créés?

Discussions similaires

  1. select where ne retourne pas tous les tuples
    Par Marc_3 dans le forum Débuter
    Réponses: 2
    Dernier message: 02/10/2015, 12h13
  2. Fonction Find ne marche pas à tous les coups...
    Par silvere123 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 01/08/2012, 15h54
  3. SELECT ne retourne pas tous les éléments d'une vue
    Par chat de nuit dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 20/03/2012, 14h38
  4. Réponses: 9
    Dernier message: 20/09/2010, 17h37
  5. Réponses: 1
    Dernier message: 08/04/2008, 13h46

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