Différences
Cette page vous affiche les différences entre la révision choisie et la version actuelle de la page.
— |
filtres:exemples [2006/10/27 12:45] (Version actuelle) mc |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | ====== 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. | ||
+ | |||
+ | <code> | ||
+ | find . -type f -print0 | xargs -0 -irempl md5sum rempl | sort | \ | ||
+ | tee myfile.md5 | cut -d' ' -f1 | uniq -d | xargs -irempl grep rempl myfile.md5 | ||
+ | </code> | ||
+ | (dup) | ||
+ | |||
+ | |||
+ | plus court, plus rapide, plus fiable, sans écriture disque : | ||
+ | <code> | ||
+ | find . -type f -print0 | xargs -0 sha1sum | sort -k 1,40 | uniq -D -w 40 | ||
+ | </code> | ||
+ | (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...) : | ||
+ | <code> | ||
+ | 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> | ||
+ | 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:~$ | ||
+ | </code> | ||
+ | |||
+ | **//note//** : si on veut simplement additionner les nombres d'une seule colonne, une boucle fait aussi bien l'affaire (© kwisatz) : | ||
+ | |||
+ | <code:bash> | ||
+ | awk '{print $2}' summary.txt | { b=0; while read a; do b=$(($a+$b)); done; echo $b; } | ||
+ | </code> |
filtres/exemples.txt · Dernière modification: 2006/10/27 12:45 par mc