Quelques Exemples Utiles

Rechercher les fichiers identiques

Cette ligne permet de trouver (dans le répertoire courant et ses sous répertoires) les fichiers binairement identiques (c'est a dire strictement identiques).

Note: Ce code étant basé sur des hashes, des collisions peuvent se produire. Il est dangereux d'automatiser une action sur la sortie de ce script sans passer par une vérification avec diff au préalable.

find . -type f -print0 | xargs -0 -irempl md5sum rempl | sort | \
        tee myfile.md5 | cut -d' ' -f1 | uniq -d | xargs -irempl grep rempl myfile.md5

(dup)

plus court, plus rapide, plus fiable, sans écriture disque :

find . -type f -print0 | xargs -0 sha1sum | sort -k 1,40 | uniq -D -w 40

(kwisatz)

le même avec le nom des fichiers “identiques” sur la même ligne (désolé c'est pas beau, j'ai pas réussi avec sed…) :

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'

(kwisatz)

3 remarques :

  1. l'indentation ameliore conciderablement la lisibilité
  2. je pense que xargs sans -n c'est mal car tu risques facilement de faire deborder ta ligne de commande
  3. si deja tu utilises perl, les autres filtres deviennent inutiles :
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 $#$_;
      }
    }
  '

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 num-utils

nodens@clement:~$ cat summary.txt
Messages Bytes
19      3839897
270     432394142
38      10003003
207     48231422
54      667190
0       0
0       0
48      4730927
821     12491225
155     402596843
nodens@clement:~$ numsum -c summary.txt
1612 914954649
nodens@clement:~$

note : si on veut simplement additionner les nombres d'une seule colonne, une boucle fait aussi bien l'affaire (© kwisatz) :

awk '{print $2}' summary.txt | { b=0; while read a; do b=$(($a+$b)); done; echo $b; }
 
filtres/exemples.txt · Dernière modification: 2006/10/27 12:45 par mc