précédant | suivant | sommaire

Compfile



petit script qui concaténe tout les fichiers répondant à un criter de votre choix, trés pratique pour créer des archives rapides.
Exemple: Dans /home/pipo vous voulez regrouper tout les fichiers finissant par .log ou commancant par trav_.
Compfile vous créera un super fichier contenant tout les autres (il seront separer par une ligne donnant la date initiale et le nom du fichier copier).
Il est même capable de concatener du HTML, c'est à dire que si vous lui demander de concatener tout les fichiers du repertoire finissant par html il fera un super fichier HTML (ou les liens dynamiques resteront valide car réaffectés)
En deux mots il est super pratique pour faire le ménage et sauver séléctivement des fichiers de n'importe quel type (pour le moment
il fait les fichiers textes et le html mais peut aussi vous servir d'outils pour tout un tas de contexte spéciaux)
Il viens ce placer dans le rayon outils de gestion de fichier au même titre que vide+jagotafupdico (en amélioré), verylink , quoi+ etc....
Il est facile à modifier et peut faire des miracles, la prochaines mouture sera encore plus top.
alain Adelmar


Pour faire tourné ce script en Perl si vous ne savez pas encore. Jetez un oeil ici



#!/usr/bin/perl -w
# remd: Usage: CompFile [Option] [Argument]                   *
# concatene tous les fichiers reconnus par votre propre motif *
# et ce en gardant (ou non option -s (silencieux)) le nom et  *
# la date initiale. Il est aussi capable de compiler du html. *
# Il prend en compte les regexp. Il s'occupe aussi de la mise *
# à jour des concatenation à l'aide de l'option -u (update)   *
# et accepte le répertoire de travail entré comme argument.   *
# exemple:                                                    *
#    .*?\.log$     concatene tous les fichiers log            *
#    /^trav/       tout les fichier commencant par etc...     *
#   ---------------------------------------------------       *
# syntaxe:                                                    *
#         CompFile [-s||-u] [repertoire_de_travail]           *
#                                                             *
# alain adelmar Janvier 2003   version : 2.01                 *
#-------------------------------------------------------------*
 
 

format STDOUT_TOP =
Page @ <<
$%

   Fichiers           Fichiers           Fichiers
================= ================= =================
.

$x = 'x*' x 28;
$lblf = "\n";
$html = $silence = $update = 0;
$f;
#------------------------traitation des argumentures
if (@ARGV == 0) {
  print "\n$x\nUsage: CompFile [Option] [nom_du_répértoire]\nPar defaut exécute le mode verbeux sans mise à jour\npensez y la prochaine fois.\n";
    $argv = 0;
}
elsif (@ARGV == 1) {
  if ($ARGV[0] =~ /^-/) {
    @optarg = split(//,$ARGV[0]);
    if ($optarg[1] eq "s") {
      $silence = 1;
    }
    if ($optarg[1] eq "u") {
      print "a savoir l\'option -u ne peut être employé avec l\'option -s (silencieux) étant son contraire (silencieux = pas de date ni de nom de fichier entre deux copies\n";
      $update++;
    }
  }
  else {
    if ($ARGV[0] =~ /^\"|\"$/) {
      s/^\"()\"$/$1/;
      $rep = $1;
      print $rep;
      &verif($rep);
    }
    elsif ($ARGV[0] =~ /^\/\w/) {
      $rep = $1;
      &verif($rep);
    }
    else { die "Erreur: Usage CompFile.pl [Option] [Argument]\nVeuillez entrer le nom_du_repertoire (complet)\n ou simplement\nCompFile.pl (qui est la commande par defaut)\n" }
  }
}
else {
  if ($ARGV[0] =~ /^-/) {
    @optarg = split(//,$ARGV[0]);
    if ($optarg[1] eq "s") {
      $silence = 1;
    }
    if ($optarg[1] eq "u") {
      print "a savoir l\'option -u ne peut être employé avec l\'option -s (silencieux) étant son contraire (silencieux = pas de date ni de nom de fichier entre deux copies\n";
      $update++;
    }
  }
  else { die "Erreur: l\'option -s ou u doit ce placer avant le nom_du_repertoire\n" }
  if ($ARGV[1] =~ /^\"|\"$/) {
    s/^\"()\"$/$1/;
    $rep = $1;
    print $rep;
    &verif($rep);
  }
  elsif ($ARGV[1] =~ /^\/\w/) {
    $rep = $1;
    &verif($rep);
  }
  else { die "Erreur: Usage CompFile.pl [Option] [Argument]\nVeuillez entrer le nom_du_repertoire (complet)\n ou simplement\nCompFile.pl (qui est la commande par defaut)\n" }
}
 

print "\n$x\nCe logiciel sert à regrouper le contenu de plusieurs\nfichiers dans un seul et meme fichier\n\tconçu par alain Adelmar \<mailto:aadelmar\@wanadoo.fr\>\np.s:Il ne detruira les originaux que si vous lui demander\n$x\n";
 

&quel_rep;
&verif($rep);

sub faitvoir_comment {

  opendir REP, "$rep" or die "ouverture de $rep impossible $!";
  @fac = (sort readdir REP);
  foreach $f(@fac) {
    # sur trois colonnes
    if ($u <= 2) {
      push @row, $f;
      $u++;
    }
    else {
      write;
      $u = 0;
      for $i(0..2) {
 delete $row[$i];
      }
    }
  }
  print "\n$x\n";
  print "\nQuel modele voulez-vous regrouper:exemple: ^trav (partie commune commencant par trav)\nou\nlog\$ (finissant par log\n";
  #ici il est possible de decrire <avant, >aprés, _dedans
  $model = <STDIN>;
  chomp $model;
  print "Créer le nom complet du superfichier qui regroupera tout les contenus\n";
  $receptacle = <STDIN>;
  chomp $receptacle;

  if ($model=~ /html$/i) {
    $html++;
    foreach $f(@fac) {
      if ($f =~ /$model/i) {
 &ad_path;
 push @a_detruire, $f;
 open F, "$f" or die "ouverture de $f impossible $!";
 @contenu = <F>;
 close F || die "fermeture de $f impossible $!";
 foreach $l(@contenu) {
   if ($firstpage == 0) {
     if ($l =~ /<\/html\>/i) {
       $firstpage++;
     }
     else {
       push @contenu, $l;
     }
   }
   else {
     if ($header == 0) {
       if ($l =~ /<body\>/i) {
  $header++;
  &ad2file($lblf);
  $l = $l . "$lblf";
  push @contenu, $l;
       }
     }
     else {
       if ($l =~ /<\/html\>/i) {
  $header = 0;
  $l = "<br\>\n<br\>\n<hr\>\n";
  push @contenu, $l;
       }
       else {
  push @contenu, $l;
       }
     }
   }
 }
      }
    }
  }

  else {
    foreach $f(@fac) {

      if ($f =~ /$model/i) {
 &ad_path;
 push @a_detruire, $f;
 open F, "$f" or die "ouverture de $f impossible $!";
 @contenu = <F>;
 close F || die "fermeture de $f impossible $!";
 &ad2file($lblf);
 unshift @contenu, $lblf;
 push @autre_contenu, @contenu;
      }
    }
  }
 

  open FC, ">$receptacle" or die "Ouverture impossible de $receptacle damened $!";

  if ($firstpage >= 1) {
    $ls = "<\/html\>\n";
    push @contenu, $ls;
    print FC "@contenu";
  }
  else {
    print FC "@autre_contenu";
  }

  close FC || die "Fermeture du fichier de recap impossible $!";
  print "ok tout a ete fait sur les fichier:\n";
  my $u = 0;
  foreach $f(@a_detruire) {
    # sur trois colonnes
    if ($u <= 2) {
      push @row, $f;
      $u++;
    }
    else {
      write;
      $u = 0;
      for $i(0..2) {
 delete $row[$i];
      }
    }
  }
  print "\n$x\nvoulez vous les détruire maintenant?";
  $response = <STDIN>;
  chomp $response;
  if ($response =~ /^o|y/i) {
    unlink @a_detruire or die "impossible de détruire les fichiers $!";
    &menu;
  }
  # on efface rien
  else {
    print "ok je laisse le tout tel-quel\n";
    &menu;
  }
}

sub ad2file($lblf) {
  if ($silence == 0) {
    # si le mode silencieux n'est pas activé
    if ($html == 0) {
      # si c'est pas du html
      @st = stat($f);
      $dst = localtime($st[9]);
      $lblf="\nfichier $f du $dst" . '====>' . "\n";
    }
    else {
      # si c'est du html
      @st = stat($f);
      $dst = localtime($st[9]);
      $lblf="\n<hr\>\n<br\>fichier $f du $dst" . '====>' . "\n<br\>";
    }
  }
  else {
    # en mode silencieux
    print "En mode silencieux: Il ne sera ajouté\nen fin de fichier qu\'un retour à la ligne\n";
  }
}
 
 

sub quel_rep {
  print "Entrez le nom du repertoire à traiter:\n";
  $rep = <STDIN>;
  chomp $rep;
  print "\n$x\n";
}

sub verif($rep) {
  while (!(-e $rep)) {
    print "fare toi encouler granda connasse your PATH de merde is no really good\ntchao pov con!\n\nentrez un nom de repertoire correct, au moins";
    $rep = <STDIN>;
    chomp $rep;
  }
  &faitvoir_comment;
}

sub menu {
  print "voulez vous poursuivre avec ce script:\n";
  $response = <STDIN>;
  chomp $response;
  if ($response =~ /^y|o/i) {
    &quel_rep ;
  }
  # that's all folk
  if ($update >= 1) {
    # voir si possible de trier par la date avec system(ls -t) pour ne pas s'enmerder aprés
    print "updater le fichier $receptacle pas encore écrit\n";
  }
  else { die "ok doc, that all folck, tchao\n\n" }
}

sub ad_path {
  if ($rep=~ /\/$/) {
    $f = "$rep" . "$f";
  }
  else {
    $f = "$rep" . "\/$f";
  }
}

format STDOUT =
@<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<
$row[0], $row[1], $row[2]
.
 

END;