L’un de mes scripts génère des fichiers de résultats et ceux ci commencent par un entête connu. Comme le script n’est pas parfait, il génère des fichiers sans aucun contenu autre que l’entête.
Pour corriger cette anomalie, il faut empêcher le script de générer les fichiers inutiles et il s’agit certainement de la meilleure solution. Mais il est également possible de supprimer les fichiers ne contenant que l’entête.

Avec qu’elle commande peut on supprimer des fichiers contenant un certain nombre de ligne ?

Les commandes qui suivent correspondent à des notes prisent lors de la résolution d’un problème particulier.
Elles ont été testées sous Ubuntu 9.10, mais elles doivent fonctionner avec toutes les distributions courantes.

Rechercher des fichiers

Pour rechercher les fichiers, on utilise la commande find. Elle comporte de nombreuses options qui permettent de réaliser des opérations complexe.

J’ai noté quelques exemples d’utilisation sur cette page , mais une lecture attentive de l’aide (man find dans une console) s’impose, une mise en page html est également disponible sur le site pwet.fr.

Les fichiers générés par mon script sont des Playlist au format m3u.
Pour les rechercher, il faut donc utiliser la commande suivante qui va rechercher tous les fichiers ayant l’extension m3u (-name "*.m3u") à partir du répertoire courant (.) :

    find . -name "*.m3u"

Le résultat sera de la forme :

    yvon@web2:/home/Musique/Playlist$ find . -name "*.m3u"
    ./katell/Patrick.m3u
    ./katell/2006.m3u
    ./katell/Laurent.m3u
    ./katell/Clips.m3u
    ./katell/H.m3u
    ./katell/V.m3u
    ./katell/C-Cascada.m3u

Compter les lignes

Pour compter le nombre de ligne, on utilise la commande wc qui donne en résultat le nombre de lignes, de mots et d’octets du fichier.
Exemple :

    yvon@web2:/home/Musique/Playlist$ wc ./katell/Patrick.m3u
      5  19 298 ./katell/Patrick.m3u

Pour obtenir le nombre de lignes uniquement, on utilisera l’option -l de wc :

    yvon@web2:/home/Musique/Playlist$ wc ./katell/Patrick.m3u
      5  19 298 ./katell/Patrick.m3u

Pour compter les lignes sur un ensemble de fichier dans un répertoire, on peut utiliser la commande

    wc -l *

Pour compter les lignes sur un ensemble de fichiers de manière récursive, il faut combiner la commande find avec la commande wc de la manière suivante :

    find . -name "*.m3u" -exec wc -l {} \;

Cette commande va rechercher les fichiers m3u à partir du dossier courant (.) et compter le nombre de lignes de chacun des fichiers trouvés (-exec wc -l {} \;).
On obtient un résultat du type :

    yvon@web2:/home/Musique/Playlist$ find . -name "*.m3u" -exec wc -l {} \;
    5 ./katell/Patrick.m3u
    5 ./katell/2006.m3u
    5 ./katell/Laurent.m3u
    5 ./katell/Clips.m3u
    5 ./katell/H.m3u
    5 ./katell/V.m3u
    20 ./katell/C-Cascada.m3u

Filtrer le résultat de la recherche

La commande précédente renvoie une liste de fichier avec le nombre de ligne qu’ils contiennent, il faut maintenant filtrer ce résultat en fonction du nombre de lignes. Pour cela, on utilise la commande awk qui permet de traiter des chaines de caractères.

Le résultat de la commande de recherche (find) va être redirigé vers la commande awk via un tuyau ou pipe, la commande awk va utiliser en entrée standard le résultat de la commande find.
Ce résultat est constitué de 2 champs : le nombre de lignes du fichier suivi du nom du fichier, les 2 champs sont séparés par un espace. On va donc afficher en sortie le nom du fichier si le nombre de ligne correspond au critère choisit.
Exemple (affiche la liste des fichiers de 5 lignes au plus) :

    yvon@web2:/home/Musique/Playlist$ find . -name "*.m3u" -exec wc -l {} \; | awk '$1 < 6 {print $2}' 
    ./katell/Patrick.m3u
    ./katell/2006.m3u
    ./katell/Laurent.m3u
    ./katell/Clips.m3u
    ./katell/H.m3u
    ./katell/V.m3u
    ./katell/U.m3u
    ./katell/Vidéo.m3u
    ./katell/Étrange.m3u
    ./katell/Nicole.m3u
    ./katell/non.m3u
    ./katell/Q.m3u
    ./katell/Goristes.m3u
    ./katell/1.m3u
    ./katell/Denez.m3u
    ./katell/Recycled.m3u

Pour accéder à l’aide de la commande awk, il faut utiliser la commande man awk dans une console ou se rendre sur la mise en page html de pwet.fr.

Supprimer les fichiers

Pour supprimer les fichiers répondant au critère spécifié (type m3u contenant moins de 6 lignes), il faut rediriger le résultat vers une commande de suppression (rm) via la commande xargs.

La commande xargs permet de construire des commandes à partir de l’entrée standard, ainsi la commande ls |xargs rm aura le même résultat que rm : tous les fichiers du répertoire courant seront supprimés !

Pour traiter mon cas particulier, la commande finale de suppression des fichiers est donc :

    find . -name "*.m3u" -exec wc -l {} \; | awk '$1 < 6 {print $2}' | xargs /bin/rm

Sur certains configuration, il y a un alias sur la commande rm pour activer la confirmation lors de la suppression d’un fichier (rm -i).
Afin de ne pas devoir confirmer la suppression de tous le fichiers, il faut utiliser la commande avec son chemin absolu (/bin/rm) pour ne pas tenir compte de cet alias, ou alors outre-passer l’alias avec la syntaxe \rm.