Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 14/11/2015, à 13:36

Brunod

awk : problème formatage nombres

Bonjour,
J'essaie de modifier un formatage de sortie de awk, que je suis loin de maîtriser.
Voici la ligne :

ls -RAGgp . | awk '/:$/&&f{s=$0;f=0}
      /:$/&&!f{sub(/:$/,"");s=$0;f=1;next}
          NF&&f{ print $3s"/"$6 }'

qui me sort les tailles /chemins/fichiers.
Mais je voudrais pour effectuer un tri que les tailles soient formatées sur un nombre fixe de position afin de permettre un tri ultérieur. Il me faut donc un alignement à droite de cette colonne ou des "leading zeros".
J'ai essayé de combiner avec un printf comme suit :

 NF&&f{ printf "%10d /%s\n",$3,$6 }'

Mais je n'arrive à rien.
Si une bonne âme passionnée de awk pouvait m'aider, je lui en serais très reconnaissant.
Merci,
BD


Windows est un système d'exploitation de l'homme par l'ordinateur. Linux, c'est le contraire...
39 pc linux convertis

Hors ligne

#2 Le 14/11/2015, à 13:51

pingouinux

Re : awk : problème formatage nombres

Bonjour,
Si j'ai bien compris, essaye

NF&&f{ printf "%010d /%s\n",$3,$6 }'

Il y a certainement beaucoup plus simple.

Ajouté :
Peut-être ceci

shopt -s globstar
stat -c "%s %n" **/* | sort -n

et pour aligner les tailles

stat -c "%10s %n" **/* | sort -n

Dernière modification par pingouinux (Le 14/11/2015, à 16:06)

Hors ligne

#3 Le 14/11/2015, à 17:56

Brunod

Re : awk : problème formatage nombres

Merci Pingouinux,
(Je me demande pourquoi, mais je m'attendais à ce que tu réagisses wink  )
La première proposition ne m'aide pas : les chemins disparaissent de chaque ligne et ne précèdent plus les noms de fichiers.
Il semble y avoir une espèce d'effet de bord avec ls...

Je n'ai pas compris l'utilisation de

shopt -s globstar

Quant à 

stat -c "%10s %n" **/* | sort -n, modifié en 
stat -c "%10s /%n" **/* | sort -rn 

Il correspond mieux à mes attentes.
Je me permettrai de te relancer si je bloque.
Merci encore !
BD


Windows est un système d'exploitation de l'homme par l'ordinateur. Linux, c'est le contraire...
39 pc linux convertis

Hors ligne

#4 Le 14/11/2015, à 18:24

pingouinux

Re : awk : problème formatage nombres

Pour la première commande, j'ai conservé tes numéros de champs, mais ils ne correspondent pas à ma sortie de ls.

Je n'ai pas compris l'utilisation de

shopt -s globstar

C'est pour que la syntaxe **/* soit reconnue (elle ne l'est pas par défaut).
Voici un extrait de man bash

globstar
                      If set, the pattern ** used in a pathname expansion con‐
                      text will match all files and zero or  more  directories
                      and  subdirectories.  If the pattern is followed by a /,
                      only directories and subdirectories match.

Hors ligne

#5 Le 14/11/2015, à 23:50

Postmortem

Re : awk : problème formatage nombres

Salut,
@Brunod :

pingouinux a écrit :

Pour la première commande, j'ai conservé tes numéros de champs, mais ils ne correspondent pas à ma sortie de ls.

On ne le dira jamais assez, "ls" n'est pas fait pour récupérer des informations et les traiter, mais seulement pour afficher des informations.


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#6 Le 15/11/2015, à 14:50

Brunod

Re : awk : problème formatage nombres

Merci @Postmortem,
Je sais, mais de toute manière, même s'il ne fait pas de différence entre noms de fichiers avec ou sans espaces, cr, lf à la fin, moi non plus quand je lis les fichiers sur mon écran. wink
Or ici, il ne travaille pas sur les noms, mais sur les tailles pour repérer les problèmes.
Je souhaite privilégier la vitesse avant tout.


Windows est un système d'exploitation de l'homme par l'ordinateur. Linux, c'est le contraire...
39 pc linux convertis

Hors ligne

#7 Le 15/11/2015, à 16:32

pingouinux

Re : awk : problème formatage nombres

Pour voir les tailles, tu as aussi

du -ab | sort -rn

ou

du -ah | sort -rh

Dernière modification par pingouinux (Le 15/11/2015, à 16:32)

Hors ligne

#8 Le 15/11/2015, à 22:00

Brunod

Re : awk : problème formatage nombres

Suite :
Je voudrai injecter le résultat de cette commande :

stat -c "%10s /%n" **/* | uniq -D -w 10| sort -rn
| cut -b 13-
| sed -e 's/ /\\ /g'
| xargs file
| cut -f 2 -d ':'
| sed -e 's/^[ \t]*//'

à réinjecter à chaque ligne, entre chaque taille et suivi du chemin/nom.ext issu de cette commande :

stat -c "%10s /%n" **/* | uniq -D -w 10| sort -rn

qui est la même que ci-dessus, sans exécuter la commande une seconde fois.
Le but est de faire ensuite un test d'unicité sur base de la clé ainsi constituée par les tailles suivies des résultats de "file".
Merci !

Dernière modification par Brunod (Le 15/11/2015, à 22:02)


Windows est un système d'exploitation de l'homme par l'ordinateur. Linux, c'est le contraire...
39 pc linux convertis

Hors ligne

#9 Le 15/11/2015, à 23:13

pingouinux

Re : awk : problème formatage nombres

Remarque : uniq ne s'appliquant qu'à des lignes adjacentes, je pense qu'il faut inverser uniq et sort

Si j'ai bien compris ce que tu veux faire

while read taille fic
do
   printf "%10s %-18s %s\n" "$taille" "$(file -b "$fic")" "$fic"
done < <(stat -c "%10s %n" **/* | sort -rn | uniq -D -w10)

Hors ligne

#10 Le 15/11/2015, à 23:35

Brunod

Re : awk : problème formatage nombres

pingouinux a écrit :

Remarque : uniq ne s'appliquant qu'à des lignes adjacentes, je pense qu'il faut inverser uniq et sort

Ah oui. j'avais un biais parce que mes doublons figurant dans le même sous répertoire, ils se suivaient déjà avant le sort. Dommage, j'espérais diminuer le nombre de ligne à trier en effectuant le uniq avant...
Merci pour le code, je regarderai pour continuer demain, l'esprit plus clair.
Edit : voici ce que j'obtiens :

bruno@UBlaptop:~/Bureau$ while read taille fic; do    printf "%10s %-18s %s\n" "$taille" "$(file -b "$fic")":"$fic"; done < <(stat -c "%10s %n" **/* | sort -rn | uniq -D -w10)|sed '/directory:/d'
    193916 XML  document text:Cadran 7733Fer.sla.autosave 
    193916 XML  document text:Cadran 7733Fer.sla 
    140153 PDF document, version 1.4:CandidatureDocs/SWDE/D_Bruno_4671_DPL1.pdf 
    140153 PDF document, version 1.4:CandidatureDocs/Diplome/D_Bruno_PsychoMaster.pdf 
     83876 PDF document, version 1.4:CandidatureDocs/Bruno_D_CV09.2014.pdf 
     83876 PDF document, version 1.4:CandidatureDocs/Bruno_D_CV01.2015.pdf 
       596 ASCII English text:MachinTorrent 
       596 ASCII text:dummy  

Je voudrais maintenant appliquer une nouvelle fois un uniq sur la partie gauche du séparateur ":" (pour virer le cas des deux dernières lignes) puis appliquer un sha1 (sur les débuts et fins de chaque fichier) sur la liste restante, re-uniq pour enfin avoir la liste des vrais doublons.
L'idée est de recréer un fichier rm duplicate.sh comme le fait rmlint.

Dernière modification par Brunod (Le 16/11/2015, à 12:39)


Windows est un système d'exploitation de l'homme par l'ordinateur. Linux, c'est le contraire...
39 pc linux convertis

Hors ligne

#11 Le 16/11/2015, à 13:05

Brunod

Re : awk : problème formatage nombres

Hmm, je reviens sur ce que j'ai dit : le md5 est beaucoup plus rapide que le sha1.


Windows est un système d'exploitation de l'homme par l'ordinateur. Linux, c'est le contraire...
39 pc linux convertis

Hors ligne

#12 Le 16/11/2015, à 14:43

pingouinux

Re : awk : problème formatage nombres

Dans ce cas, il est peut-être plus simple de faire un premier tri en comparant les md5sum des 1000 premiers octets des fichiers,  puis de faire un md5sum sur la totalité des fichiers ayant passé le premier test.

while read md5 tiret fic
do
   printf "%s %s\n" "$(md5sum "$fic")" "$fic"
done < <(
     for f in **/*
     do
        [ -f "$f" ] && printf "%s %s\n" "$(md5sum < <(head -c 1000 "$f"))" "$f"
     done | sort | uniq -D -w 32
      ) | sort | uniq -D -w 32

Hors ligne

#13 Le 16/11/2015, à 15:41

Brunod

Re : awk : problème formatage nombres

Presque : j'aimerais que cela se fasse après le test de la commande "file" pour ne pas comparer des fichiers de tailles identiques et dont la "nature" est clairement différente, (ceci se faisant sans se baser sur l'extension du fichier).
Voici un exemple de "confusion" :

bruno@UBlaptop:~/Bureau$ while read taille fic; do    printf "%10s %-18s %s\n" "$taille" "$(file -b "$fic")":"$fic"; done < <(stat -c "%10s %n" **/* | sort -rn | uniq -D -w10)|sed '/directory:/d'
    193916 XML  document text:Cadran 7733Fer.sla.autosave 
    193916 XML  document text:Cadran 7733Fer.sla 
    140153 PDF document, version 1.4:CandidatureDocs/SWDE/D_Bruno_4671_DPL1.pdf 
    140153 PDF document, version 1.4:CandidatureDocs/Diplome/D_Bruno_PsychoMaster.pdf 
     83876 PDF document, version 1.4:CandidatureDocs/Bruno_D_CV09.2014.pdf 
     83876 PDF document, version 1.4:CandidatureDocs/Bruno_D_CV01.2015.pdf 
       596 ASCII English text:Maple17Torrent 
       596 ASCII text:dummy   

Les deux derniers fichiers ont la même taille mais ne sont clairement pas identiques : pas de md5 requis pour gagner du temps.
Mais pour cela, je dois utiliser comme clé de tri tout ce qui précède le séparateur ":"

Pour le md5, serait-il possible d'utiliser une combinaison head + tail du fichier ? Je crains des en-têtes de fichiers semblables pour certaines catégories de fichiers.
(Tu me diras ce que je te dois pour le travail, en plus des honneurs évidents et de ma sincère reconnaissance !) smile
Edit : mon obsession pour l'optimisation vient du fait d'avoir déjà tenté quelques outils pour faire le ménage sur un nas avec processeur arm, toujours avec interruption sans succès après des jours d'attente...

Dernière modification par Brunod (Le 16/11/2015, à 15:45)


Windows est un système d'exploitation de l'homme par l'ordinateur. Linux, c'est le contraire...
39 pc linux convertis

Hors ligne

#14 Le 16/11/2015, à 15:54

Brunod

Re : awk : problème formatage nombres

Brunod a écrit :

...
L'idée est de recréer un fichier rm duplicate.sh comme le fait rmlint.

... mais en changeant la procédure d'identification des doublons
car aussi trop lente.

Unix shell script for removing duplicate files
by Jarno Elonen, 2003-04-06...2013-01-17
http://elonen.iki.fi/code/misc-notes/re … ate-files/

OUTF=rem-duplicates.sh;
echo "#! /bin/sh" > $OUTF;
find "$@" -type f -printf "%s\n" | sort -n | uniq -d |
    xargs -I@@ -n1 find "$@" -type f -size @@c -exec md5sum {} \; |
    sort --key=1,32 | uniq -w 32 -d --all-repeated=separate |
    sed -r 's/^[0-9a-f]*( )*//;s/([^a-zA-Z0-9./_-])/\\\1/g;s/(.+)/#rm \1/' >> $OUTF;
chmod a+x $OUTF; ls -l $OUTF

Windows est un système d'exploitation de l'homme par l'ordinateur. Linux, c'est le contraire...
39 pc linux convertis

Hors ligne

#15 Le 16/11/2015, à 20:42

pingouinux

Re : awk : problème formatage nombres

Tu peux essayer ceci (création de 2 fichiers intermédiaires supprimés à la fin)

# Comparaison des tailles et des types de fichiers (on ne tient compte que des 70 premiers caractères du type)
while read taille fic
do
   [ -f "$fic" ] && printf "%10s %-70s :%s\n" "$taille" "$(file -b "$fic")" "$fic"
done < <(stat -c "%10s %n" **/* | sort -rn | uniq -D -w10) | sort -rn | uniq -D -w81 >/tmp/tmp1.$$

# Comparaison des md5sum des 1000 premiers et 1000 derniers octets des fichiers
while IFS=: read deb fic
do
   printf "%s%s:%s\n" "$(md5sum < <(head -c 1000 "$fic"))" "$(md5sum < <(tail -c 1000 "$fic"))" "$fic"
done </tmp/tmp1.$$ | sed 's/ -//g' | sort | uniq -D -w65 >/tmp/tmp2.$$

# Comparaison des md5sum des fichiers complets
while IFS=: read deb fic
do
   md5sum "$fic"
done </tmp/tmp2.$$ | sort | uniq -D -w32 

rm /tmp/tmp1.$$ /tmp/tmp2.$$

Hors ligne

#16 Le 16/11/2015, à 20:56

Brunod

Re : awk : problème formatage nombres

Merci ! Je regarde (si je comprends) et je reviens. Ça risque de prendre un peu de temps... smile


Windows est un système d'exploitation de l'homme par l'ordinateur. Linux, c'est le contraire...
39 pc linux convertis

Hors ligne

#17 Le 16/11/2015, à 23:08

pingouinux

Re : awk : problème formatage nombres

Voici une version corrigée :

# Comparaison des tailles et des types de fichiers (on ne tient compte que des 70 premiers caractères du type)
while read siz fic
do
   printf "%10s@%-70s@%s\n" "$siz" "$(file -b "$fic"|sed 's/@/_/g')" "$fic"
done < <(find -type f -exec stat -c "%10s %n" {} \; | sort -rn | uniq -D -w10) | sort -rn | uniq -D -w82 >/tmp/tmp1.$$

# Comparaison des md5sum des 1000 premiers et 1000 derniers octets des fichiers
while IFS=@ read siz typ fic
do
   printf "%s@%s%s@%s\n" "$siz" "$(md5sum < <(head -c 1000 "$fic"))" "$(md5sum < <(tail -c 1000 "$fic"))" "$fic"
done </tmp/tmp1.$$ | sort -rn | uniq -D -w82 >/tmp/tmp2.$$

# Comparaison des md5sum des fichiers complets
while IFS=@ read siz md5 fic
do
   printf "%s %s\n" "$siz" "$(md5sum "$fic")" 
done </tmp/tmp2.$$ | sort -rn | uniq -D -w43 

rm /tmp/tmp1.$$ /tmp/tmp2.$$

Édité : Petites corrections
Édité (2) : Remplacement des @ par des _ dans la sortie de la commande file, car @ sert de séparateur

Dernière modification par pingouinux (Le 17/11/2015, à 22:27)

Hors ligne

#18 Le 17/11/2015, à 16:24

Brunod

Re : awk : problème formatage nombres

Merci Pingouinux,
Je découvre et teste la dernière version.

bruno@UBlaptop:~$ time while read taille fic; do    [ -f "$fic" ] && printf "%10s %-70s :%s\n" "$taille" "$(file -b "$fic")" "$fic"; done < <(stat -c "%10s %n" **/* | sort -rn | uniq -D -w10) | sort -rn | uniq -D -w81 >/tmp/tmp1.$$

real	0m0.497s
user	0m0.188s
sys	0m0.060s
bruno@UBlaptop:~$ time while read siz fic; do    printf "%10s@%-70s@%s\n" "$siz" "$(file -b "$fic")" "$fic"; done < <(find -type f -exec stat -c "%10s %n" {} \; | sort -rn | uniq -D -w10) | sort -rn | uniq -D -w82 >/tmp/tmp1.$$
find: "./.mc/cedit": Permission non accordée
^C

real	0m5.673s
user	0m0.012s
sys	0m0.000s
bruno@UBlaptop:~$ 

Je n'aime pas le find... Et même en sudo ça ne fonctionne pas.
Mais la première version de cette section semblait parfaite.
Je creuse... smile
Edit : Ah, c'est peut-être encore un coup de glob.
- Non, shopt -s globstar ne change rien.
Je vais tenter de te proposer un remix (plein de fautes) et de français...

Dernière modification par Brunod (Le 17/11/2015, à 17:23)


Windows est un système d'exploitation de l'homme par l'ordinateur. Linux, c'est le contraire...
39 pc linux convertis

Hors ligne

#19 Le 17/11/2015, à 17:42

Brunod

Re : awk : problème formatage nombres

Voici Frankenstein soft : (Edit : avec modifs en cours...)

#! /bin/sh
# bdpin.sh
# big dupe pin out
# Pingouinux – BD - 2015
OUTF=rem-duplicates.sh;
echo "#! /bin/sh" > $OUTF;
#########
shopt -s globstar
#
while read taille fic
do
   [ -f "$fic" ] && printf "%10s %-70s :%s\n" "$taille" "$(file -b "$fic")" "$fic"
done < <(stat -c "%10s %n" **/* | sort -rn | uniq -D -w10) | sort -rn | uniq -D -w81 >/tmp/tmp1.$$

# Comparaison des md5sum des premiers 2Mo et derniers 2 Moctets des fichiers (et garde le size)

# test si la taille > 4 Mo , si oui : le fichier d'entrée étant ordonné décroissant, 
while IFS=@ read siz typ fic
	while [siz -bg 4 Mo]
	do
	   printf "%s@%s%s@%s\n" "$siz" "$(md5sum < <(head -c 2Mo "$fic"))" "$(md5sum < <(tail -c 2Mo "$fic"))" "$fic"
	done 
printf "%s@%s%s@%s\n" "$siz" "$(md5sum "$fic") »
done </tmp/tmp1b.$$ | sort -rn | uniq -D -w82 >/tmp/tmp2b.$$
# si non : direct dans tmp2 pour calcul md5 complet 
#(sans quoi est calculé 3x : head, tail, total)
# Comparaison des md5sum des fichiers complets
while IFS=@ read siz md5 fic
while [siz -le 4 Mo]
do
   printf "%s %s\n" "$siz" "$(md5sum "$fic")" 
done </tmp/tmp2b.$$ | sort -rn | uniq -D -w43 

#rm \1/' >> $OUTF;
chmod a+x $OUTF; ls -l $OUTF

dont le fichier de sortie tojours ordonné décroissant donnerait ceci :  cat rem-duplicates.sh

#! /bin/sh
# 193916
#rm ./Cadran\ 7733Fer.sla
#rm ./Cadran\ 7733Fer.sla.autosave
#140153
#rm ./CandidatureDocs/Diplome/D_Bruno_PsychoMaster.pdf
#rm ./CandidatureDocs/SWDE/D_Bruno_4671_DPL1.pdf
#83876
#rm ./CandidatureDocs/Bruno_D_CV01.2015.pdf
#rm ./CandidatureDocs/Bruno_D_CV09.2014.pdf

Qu'en penses-tu ?

Dernière modification par Brunod (Le 17/11/2015, à 20:27)


Windows est un système d'exploitation de l'homme par l'ordinateur. Linux, c'est le contraire...
39 pc linux convertis

Hors ligne

#20 Le 17/11/2015, à 22:28

Ferod

Re : awk : problème formatage nombres

Bonjour
Si c'est la recherche des fichiers dupliqués qui vous intéresse alors peut être que fslint (https://doc.ubuntu-fr.org/fslint) vous intéressera.
Si c'est de progresser en bash / awk alors vous m'avez déjà perdu. Je vous laisse continuer ! smile


"When I was in the military, they gave me a medal for killing
two men, and a descharge for loving one !" Leonard Matlovich

Hors ligne

#21 Le 18/11/2015, à 10:04

Brunod

Re : awk : problème formatage nombres

@Ferod : merci, mais fslint (que je connais depuis longtemps) ne m'aide pas dans le cas présent, et bien que je m'en serve avec gui sur mon pc. De même de fdupes, rmlint (source d'inspiration) et autres dont je ne retrouve pas les noms, aussi testés.


Windows est un système d'exploitation de l'homme par l'ordinateur. Linux, c'est le contraire...
39 pc linux convertis

Hors ligne

#22 Le 18/11/2015, à 18:15

pingouinux

Re : awk : problème formatage nombres

Voici deux méthodes, la seconde étant plus simple et plus rapide. Si la liste obtenue te convient, il est facile de générer le fichier rem-duplicates.sh.

Remarques :

  • J'utilise find.
         - Avec la syntaxe **/*, il faudrait ajouter shopt -s dotglob, pour prendre en compte les fichiers ou répertoires commençant par un point dans le répertoire de départ
         - Si on part d'un répertoire très peuplé, on peut avoir une liste d'arguments trop longue

    $ stat ~/**/* >/dev/null
    bash: /usr/bin/stat: Argument list too long
  • On peut calculer le md5sum des n premiers octets d'un fichier, même si le fichier est plus petit que n. On obtient dans ce cas le md5sum du fichier complet

Méthode 1 (même principe qu'en #17)

#!/bin/bash

# Comparaison des tailles et des types de fichiers (on ne tient compte que des 70 premiers caractères du type)
while read -r siz fic
do
   printf "%10s@%-70s@%s\n" "$siz" "$(file -b "$fic"|sed 's/@/_/g')" "$fic"
done < <(find "$@" -type f -exec stat -c "%10s %n" {} \; | sort -rn | uniq -D -w10) | sort -t@ -k1,1nr -k2,2 | uniq -D -w82 >/tmp/tmp1.$$

# Comparaison des md5sum des 1000 premiers et 1000 derniers octets des fichiers
while IFS=@ read -r siz typ fic
do
   printf "%s@%s%s@%s\n" "$siz" "$(md5sum < <(head -c 1000 "$fic"))" "$(md5sum < <(tail -c 1000 "$fic"))" "$fic"
done </tmp/tmp1.$$ | sort -t@ -k1,1nr -k2,2 | uniq -D -w82 >/tmp/tmp2.$$

# Comparaison des md5sum des fichiers complets
while IFS=@ read -r siz md5 fic
do
   printf "%s@%s\n" "$siz" "$(md5sum "$fic")"
done </tmp/tmp2.$$ | sort -t@ -k1,1nr -k2,2 | uniq -D -w43

rm /tmp/tmp1.$$ /tmp/tmp2.$$

Méthode 2 (on ne tient compte dans un premier temps que de la taille et du md5sum des 1000 premiers octets)

#!/bin/bash

# Comparaison des tailles et des md5sum des 1000 premiers octets des fichiers
while IFS=@ read -r siz fic
do
   printf "%s@%s@%s\n" "$siz" "$(md5sum < <(head -c 1000 "$fic"))" "$fic"
done < <(find "$@" -type f -exec stat -c "%10s@%n" {} \; | sort -rn | uniq -D -w10) | sort -t@ -k1,1nr -k2,2 | uniq -D -w43 >/tmp/tmp1.$$

# Comparaison des md5sum des fichiers complets
while IFS=@ read -r siz md5 fic
do
   printf "%s@%s\n" "$siz" "$(md5sum "$fic")"
done </tmp/tmp1.$$ | sort -t@ -k1,1nr -k2,2 | uniq -D -w43

rm /tmp/tmp1.$$

Hors ligne

#23 Le 18/11/2015, à 18:42

Brunod

Re : awk : problème formatage nombres

EDIT : Je n'avais pas vu le message précédent avant de poster celui-ci... J'ai adopté une troisième voie. wink
Nouvel état des lieux :

#! /bin/bash
# bdpin.sh
# big dupe pin out
# Pingouinux – BD - 2015
#OUTF=rem-duplicates.sh;
#echo "#! /bin/bash" > $OUTF;
#########
shopt -s globstar

# Lister récursif depuis répertoire courant des tailles et noms;
# trier pour garder doublons décroissants, ajouter "type" via file, trier pour garde doublons sur taille et type
while read taille fic
do
   [ -f "$fic" ] && printf "%10s %-70s :%s\n" "$taille" "$(file -b "$fic")" "$fic"
done < <(stat -c "%10s %n" **/* | sort -rn | uniq -D -w10) | sort -rn | uniq -D -w82 >/tmp/tmp1.$$

# Comparaison des md5sum des premiers 2Mo et derniers 2 Moctets des fichiers (et garde le size)
# 	test si la taille > 4 Mo , si oui : (le fichier d'entrée étant ordonné décroissant,) 
while IFS=@ read siz typ fic
do
	while [ "$siz" -gt "4000000" ]
	do
# concaténer 4Mo = 2 head + 2 tail
	   UnMD=$(head -c 2000000 "$fic")$(tail -c 2000000 "$fic")
# un seul md5 sur les 4 Mo reconstitués
	   printf "%s %s\n" "$siz" "$(md5sum "$UnMD")"
	   read siz typ fic
	done 
# un seul md5 sur les fichiers <=4 Mo
printf "%s@%s%s@%s\n" "$siz" "$(md5sum "$fic")" »
done </tmp/tmp1.$$ | sort -rn | uniq -D -w82 >/tmp/tmp2b.$$
# si > 4 Mo et toujours dans liste après md5 concaténé : calcul md5 complet 
# Comparaison des md5sum des fichiers complets
while IFS=@ read siz typ fic
do 
	while [ "$siz" -gt "4000000" ]
	do
	   printf "%s %s\n" "$siz" "$(md5sum "$fic")" 
	   read siz typ fic
	done
done </tmp/tmp2b.$$ | sort -rn | uniq -D -w43 

#rm \1/' >> $OUTF;
#chmod a+x $OUTF; ls -l $OUTF

ReEDIT : Corrections... Il doit encore être possible d'optimiser, surtout la fin. Mais fatigue pour ce soir smile

Dernière modification par Brunod (Le 18/11/2015, à 21:46)


Windows est un système d'exploitation de l'homme par l'ordinateur. Linux, c'est le contraire...
39 pc linux convertis

Hors ligne

#24 Le 19/11/2015, à 13:01

pingouinux

Re : awk : problème formatage nombres

Pour générer le fichier rem-duplicates.sh, il suffit de filtrer la sortie d'un des scripts en #22 avec cette commande :

awk 'BEGIN{print"#!/bin/sh"}{if(s!=$1){t=$1;sub("@.*","",t);printf("\n# Longueur : %10s\n",t);s=$1}{$1="";sub(" ","");print"#rm \""$0"\""}}'

Remarque : Dans chaque série de fichiers identiques, il faut conserver au moins un des #rm sans le décommenter

Dernière modification par pingouinux (Le 19/11/2015, à 13:31)

Hors ligne

#25 Le 19/11/2015, à 17:36

Brunod

Re : awk : problème formatage nombres

pingouinux a écrit :

..., il suffit de ...

J'aime la facilité avec laquelle tu élabores ces commandes smile
Mais je ne partage pas ta perception. Et donc je te remercie d'autant plus pour le coup de main.


Windows est un système d'exploitation de l'homme par l'ordinateur. Linux, c'est le contraire...
39 pc linux convertis

Hors ligne