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 :

Supprimer les fichiers txt de moins de 3 lignes


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 51
    Par défaut Supprimer les fichiers txt de moins de 3 lignes
    Bonjour,
    J'ai dans un repertoire des centaines de milliers de fichiers txt, et je voudrais supprimer tous les fichiers de moins de 3 lignes.

    Je cherche un moyen efficace de la faire.

    Je pense à un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    for i in `ls *.txt`;
    do
    nb=`wc -l $i`
    if [nb -le 3]
    then
    `rm - f $i`
     fi
    done
    Mais je ne sais pas ce que ça vaut en efficacité, vu que c'est sur des millions de fichiers (un peu moins).

    Peut être que faire ça en perl est préférable?

    Merci d'avance.

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    Bonjour,,

    ON N'UTILISE PAS ls DANS LES SCRIPTS !!!
    parce que les noms de fichiers peuvent contenir des caractères contenus dans l'IFS, qui feront itérer la boucle for sur chaque mot du nom du fichier.

    pour des traitements textuels, perl est beaucoup plus rapide que le shell.
    mais ici, de toutes manières, il faut boucler sur les fichiers pour déterminer le nombres de lignes, je doute que perl apporte quelque gain que ce soit.

    en propre, ton script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for f in *.txt
    do
       test -f "$f" && test $(wc -l < "$f") -le 3 && rm -f "$f"
    done
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 51
    Par défaut
    merci beaucoup!

    Effectivement, mon code était très sale, j'ai tapé ça depuis une tablette, c'était plus du pseudo-code...

    Merci en tout cas, je vais faire ça.

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    je doute que perl apporte quelque gain que ce soit.
    n'importe quelle solution qui ne comptera pas plus de lignes que le maximum recherché (ici 3) - éventuellement MAX+1 avec un head -n en amont du wc -l - sera théoriquement plus efficace que wc seul qui lui lira toujours TOUT le fichier.

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par JeitEmgie Voir le message
    n'importe quelle solution qui ne comptera pas plus de lignes que le maximum recherché (ici 3) - éventuellement MAX+1 avec un head -n en amont du wc -l - sera théoriquement plus efficace que wc seul qui lui lira toujours TOUT le fichier.
    Ben, effectivement, théoriquement, ça paraît séduisant!...
    sauf qu'il faut comparer avec le surcoût dû au fork pour lancer le process 'head'!

    En gros, s'il y a des millions de fichiers qui font, en majorité, entre moins de 3 lignes et "pas beaucoup plus" (notez la précision mathématique!), il vaut mieux utiliser le wc SANS head.
    S'il y a des millions de fichiers, dont quelques uns font moins de 3 lignes et "beaucoup d'autres" font "beaucoup plus" (par exemple, plusieurs millions de lignes), alors probablement (avec une probabilité probablement substantiellement supérieure à 1/2 (notez la précision mathématique!)) qu'il vaut mieux utiliser le wc AVEC head.

    Entre les deux, mon coeur balance...

    Le mieux, c'est de tester préalablement les 2 méthodes pour voir laquelle est la plus efficace!!! (joke )

  6. #6
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    (joke )
    Ben non pourquoi pas ? Ça se fait des tests de perf pour ce genre de petits détails (ça peux avoir un impacte sur de très grosses volumétries sérieusement).


  7. #7
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Ben, effectivement, théoriquement, ça paraît séduisant!...
    sauf qu'il faut comparer avec le surcoût dû au fork pour lancer le process 'head'!

    En gros, s'il y a des millions de fichiers qui font, en majorité, entre moins de 3 lignes et "pas beaucoup plus" (notez la précision mathématique!), il vaut mieux utiliser le wc SANS head.
    S'il y a des millions de fichiers, dont quelques uns font moins de 3 lignes et "beaucoup d'autres" font "beaucoup plus" (par exemple, plusieurs millions de lignes), alors probablement (avec une probabilité probablement substantiellement supérieure à 1/2 (notez la précision mathématique!)) qu'il vaut mieux utiliser le wc AVEC head.

    Entre les deux, mon coeur balance...

    Le mieux, c'est de tester préalablement les 2 méthodes pour voir laquelle est la plus efficace!!! (joke )
    J'ai dit "éventuellement avec un head" pas que c'était LA solution,
    le mieux reste un petit script en Perl (ou autre, vous pouvez aussi faire le tool en C et le compiler) qui prend en paramètres :
    le nombre de lignes à tester, le nom du fichier
    et qui renvoit 1 ou 0 en fonction de la satisfaction ou non du critère.

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Ben, effectivement, théoriquement, ça paraît séduisant!...
    sauf qu'il faut comparer avec le surcoût dû au fork pour lancer le process 'head'!

    En gros, s'il y a des millions de fichiers qui font, en majorité, entre moins de 3 lignes et "pas beaucoup plus" (notez la précision mathématique!), il vaut mieux utiliser le wc SANS head.
    S'il y a des millions de fichiers, dont quelques uns font moins de 3 lignes et "beaucoup d'autres" font "beaucoup plus" (par exemple, plusieurs millions de lignes), alors probablement (avec une probabilité probablement substantiellement supérieure à 1/2 (notez la précision mathématique!)) qu'il vaut mieux utiliser le wc AVEC head.

    Entre les deux, mon coeur balance...
    Bonjour

    Ben ne balance plus et tente une autre approche. On pourrait par exemple utiliser un find pour ne cibler que les fichiers qui, a priori, feront moins de 3 lignes...

    Considerons qu'une ligne d'un fichier texte fait traditionnellement 80car, cela ferait 240 caracteres pour 3 lignes. Une petite marge de securite (disons 1000 ou soyons riche et montons jusqu'a 5000) et on peut faire un truc de ce style
    Code sh : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    find rep -type f -name "*.txt" -size -5000 | while read f
    do
        test $(wc -l "$f") -le 3 && rm -f "$f"
    done
    La taille du fichier etant stockee dans l'inode, la recherche sera tres rapide et cela evitera les problemes lies au wc sur de gros fichiers...

    Citation Envoyé par N_BaH Voir le message
    ON N'UTILISE PAS ls DANS LES SCRIPTS !!!
    Arf, toujours cette bonne blague

    Citation Envoyé par N_BaH Voir le message
    parce que les noms de fichiers peuvent contenir des caractères contenus dans l'IFS, qui feront itérer la boucle for sur chaque mot du nom du fichier.
    Mougnou qu'il est mignon quand il fait sa grosse colere
    Code sh : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ls rep | while read f
    do
        traitement "$f"
    done


    PS: les bons programmeurs respectent les regles, les programmeurs brillants les transgressent parfois...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. supprimer les fichiers a partir d'un fichier txt
    Par bigs3232 dans le forum Unix
    Réponses: 7
    Dernier message: 23/06/2010, 08h57
  2. supprimer un fichier txt
    Par jamesleouf dans le forum C++
    Réponses: 7
    Dernier message: 09/05/2006, 04h05
  3. supprimer les fichiers qui ont des mêmes noms
    Par manaboko dans le forum Langage
    Réponses: 5
    Dernier message: 08/03/2006, 09h09
  4. supprimer un fichier .txt
    Par yannickrohel dans le forum C
    Réponses: 4
    Dernier message: 08/02/2006, 21h05
  5. [Messenger] Windows me supprime les fichiers envoyés
    Par Oluha dans le forum Messagerie instantanée
    Réponses: 8
    Dernier message: 24/11/2005, 13h19

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