Une page dans votre Wiki a été ajoutée ou modifiée. Voici les détails : Date : 2006/10/27 12:45 Navigateur : Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.8.0.4) Gecko/20060406 Firefox/1.5.0.4 (Debian-1.5.dfsg+1.5.0.4-1) Adresse IP : 82.253.200.65 Nom d'hôte : lns-bzn-46-82-253-200-65.adsl.proxad.net Ancienne révision : http://cli.asyd.net/home/filtres/exemples?rev=1161856696 Nouvelle révision : http://cli.asyd.net/home/filtres/exemples Résumé : Utilisateur : mc @@ -25,8 +25,32 @@ find . -type f -print0 | xargs -0 sha1sum | sort -k 1,40 | uniq -D -w 40 | \ perl -e '@f=();sub p{print "@f\n";@f=()};while(<>){chop;($h,$f)=split / /;p if $g and $h ne $g;$g=$h;push @f,$f};p' </code> (kwisatz) + + 3 remarques : + - l'indentation ameliore conciderablement la lisibilité + - je pense que xargs sans -n c'est mal car tu risques facilement de faire deborder ta ligne de commande + - si deja tu utilises perl, les autres filtres deviennent inutiles : + + <code bash> + find . -type f -print0 | + xargs -n20 -0 sha1sum | + perl -lne ' + $hash = substr($_,0,40); + $file = substr($_,42); + push @{ $a{$hash} } , $file; + END { + for ( values %a ) { + print "@$_" if $#$_; + } + } + ' + </code> + + Pour le meme nombre de lignes, on a une version pure perl en utilisant Digest::Sha1. + + (mc) ===== Additionner les nombres de chaque colonne d'un fichier avec num-utils ===== voir [[filtres:autres#num-utils]] <code:bash> -- Ce message a été généré par DokuWiki http://cli.asyd.net/home/
On Fri, Oct 27, 2006 at 12:45:13PM +0200, noreply@asyd.net wrote:
@@ -25,8 +25,32 @@ find . -type f -print0 | xargs -0 sha1sum | sort -k 1,40 | uniq -D -w 40 | \ perl -e '@f=();sub p{print "@f\n";@f=()};while(<>){chop;($h,$f)=split / /;p if $g and $h ne $g;$g=$h;push @f,$f};p' </code> (kwisatz)
En préambule, effectivement ce code est naze, je pense qu'il vaut mieux le supprimer carrément. Je propose de ne laisser que la version courte et efficace : find . -type f -print0 | xargs -0 sha1sum | sort -k 1,40 | uniq -D -w 40 et de supprimer tout le reste.
+ 3 remarques : + - l'indentation ameliore conciderablement la lisibilité
mais pas le copier/coller :-)
+ - je pense que xargs sans -n c'est mal car tu risques facilement de faire deborder ta ligne de commande
Heureusement que non, xargs c'est fait pour ça :-) xargs --show-limits pour voir la limite sur ton système, et xargs -s pour utiliser une valeur différente.
+ - si deja tu utilises perl, les autres filtres deviennent inutiles : + + <code bash> [..] + </code> + + Pour le meme nombre de lignes, on a une version pure perl en utilisant Digest::Sha1.
Du coup pourquoi ne pas donner direct le script perl qui va bien, et qui en profitera pour comparer les binaires réellement pour éviter les collisions ? Celui-là ne va pas, parce-qu'il bufferise le résultat entier de la commande précédente, ce qu'a déjà fait le sort mais qu'on ne pouvait pas éviter. on double la conso mémoire de la solution complête, et on impacte dramatiquement les perfs. ++ PS: la prochaine fois on ajoutera un ~~discussion~~ ;-) -- /// Stephane Jourdois /"\ ASCII RIBBON CAMPAIGN \\\ ((( Consultant securite \ / AGAINST HTML MAIL ))) \\\ 24 rue Cauchy X /// \\\ 75015 Paris / \ +33 6 8643 3085 ///
On 2006-10-27 14:33:27 +0200, Stephane Jourdois wrote:
Du coup pourquoi ne pas donner direct le script perl qui va bien, et qui en profitera pour comparer les binaires réellement pour éviter les collisions ?
Celui-là ne va pas, parce-qu'il bufferise le résultat entier de la commande précédente, ce qu'a déjà fait le sort mais qu'on ne pouvait pas éviter. on double la conso mémoire de la solution complête, et on impacte dramatiquement les perfs.
Pour chercher des fichiers identiques dans un répertoire, mieux vaut lire les fichiers bloc par bloc et comparer les blocs directement, car un hash est long à calculer et les fichiers diffèrent en général dans les premiers octets. Mais tout d'abord, faire une comparaison des longueurs, puisque l'accès à cette donnée est plus rapide que d'ouvrir le fichier. -- Vincent Lefèvre <vincent@vinc17.org> - Web: <http://www.vinc17.org/> 100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/> Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)
Vincent, je t'aime ! c'est un vrai bonheur de prendre un peu de bon sens en pleine gueule a chaque fois que tu postes ! marc le 27/10/2006, Vincent Lefevre nous �crivait :
Pour chercher des fichiers identiques dans un répertoire, mieux vaut lire les fichiers bloc par bloc et comparer les blocs directement, car un hash est long à calculer et les fichiers diffèrent en général dans les premiers octets. Mais tout d'abord, faire une comparaison des longueurs, puisque l'accès à cette donnée est plus rapide que d'ouvrir le fichier.
-- téléphone : 03.90.24.00.19 courriel : marc.chantreux@ulpmm.u-strasbg.fr ---------------------------------------
Le Fri, Oct 27, 2006 at 02:33:27PM +0200, Stephane Jourdois a écrit:
perl -e '@f=();sub p{print "@f\n";@f=()};while(<>){chop;($h,$f)=split / /;p if $g and $h ne $g;$g=$h;push @f,$f};p' </code> (kwisatz) En préambule, effectivement ce code est naze, je pense qu'il vaut mieux le supprimer carrément. (snip)
Voilà, ça, par contre, ça m'intéresse, donc placer le reply-to de la liste des commits vers cette liste-là, ce serait impeccable :) Arnaud. -- Perso: http://launay.org/blog/ Hébergement: http://www.nocworld.com/
Stephane Jourdois <kwisatz-shell@rubis.org> (27/10/2006):
Du coup pourquoi ne pas donner direct le script perl qui va bien, et qui en profitera pour comparer les binaires réellement pour éviter les collisions ?
Pour ceux qui ne connaîtraient pas : ,---[apt-cache show fdupes]--- | Description: Identifies duplicate files within given directories | FDupes uses md5sums and then a byte by byte comparison to find | duplicate files within a set of directories. It has several useful | options including recursion. `----------------------------- ou encore via la homepage : http://premium.caribe.net/~adrian2/fdupes.html
Celui-là ne va pas, parce-qu'il bufferise le résultat entier de la commande précédente, ce qu'a déjà fait le sort mais qu'on ne pouvait pas éviter. on double la conso mémoire de la solution complête, et on impacte dramatiquement les perfs.
OK ça n'est plus du shell, mais ça fait ce qui était voulu avec des perfs raisonnables, je pense. Bonne nuit, -- Cyril PS : J'en profite pour mettre un Subject: à peu près lisible...
participants (6)
-
Arnaud Launay
-
Cyril Brulebois
-
Marc Chantreux
-
noreply@asyd.net
-
Stephane Jourdois
-
Vincent Lefevre