Table des matières
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 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; }