2011-10-25 2 views
1

J'ai une liste de fichiers dans un répertoire qui sont générés automatiquement par un système avec la date dans le nom de fichier. Voici quelques exemples: audit_20111020, audit_20111021, audit_20111022, etc.unix trouver les noms de fichier qui sont moins lexicographiquement qu'un nom de fichier

Je veux donc nettoyer les fichiers de plus de 18 mois, je veux mettre en place une commande unix trouver qui trouve des fichiers moins de audit_20100501 et de les supprimer.

Est-ce que quelqu'un sait comment utiliser l'ordre lexicographique comme critère dans la commande find?

Répondre

1

Avec Perl, c'est facile. Type perl et:

for (glob "*") 
{ 
    my($n) = /(\d+)/; 
    unlink if ($n < 20100501); 
} 
^D 

Test avant utilisation. Notez que je supposer que ce soit un format fixe et le répertoire ne contient que ces fichiers

+0

il est plus sûr d'utiliser "vérification_*". – jfs

2

Une autre variante Perl:

perl -E'while(<audit_*>) { say if /(\d{8})/ && $1 < 20100501}' 

Remplacer say par unlink si elle imprime les noms de fichiers attendus.

Remarque: < effectue une comparaison numérique, utilisez lt si vous souhaitez comparer les chaînes.

+0

+1, beaucoup plus sûr! :-) – sidyll

0

Il est possible de trier résultat de find en utilisant la commande sort:

find . -name "audit*" | sort -n 

... puis trouver un moyen de diviser cette liste.


Mais pour ce que vous voulez faire, par exemple supprimer des répertoires antérieurs à une certaine date (18 mois est ~ 547 jours), vous pouvez utiliser le ci-dessous à la place:

find -ctime -547 -type d | xargs -I{} rm -rf {} 
Questions connexes