====== 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 :
- 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 :
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 [[filtres:autres#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; }