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.

#26 Le 19/11/2015, à 18:00

pingouinux

Re : awk : problème formatage nombres

Je me suis mal exprimé. Le il suffit… ne s'appliquait qu'à l'opération de filtre une fois la commande mise au point (je l'avais testée à part). smile

Hors ligne

#27 Le 20/11/2015, à 23:17

Brunod

Re : awk : problème formatage nombres

pingouinux a écrit :

Je me suis mal exprimé. Le il suffit… ne s'appliquait qu'à l'opération de filtre une fois la commande mise au point (je l'avais testée à part). smile

J'avais compris, mais je te taquine sur la facilité avec laquelle tu manies les scripts.
Voici l'état d'avancement. Je dois encore intégrer ta dernière ligne pour mise en forme de rem-duplicate.sh

#! /bin/bash
# bdpin.sh
# big dupe pin out
# Pingouinux – BD - 2015
#########
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.$$
echo "###################### Étape 1 terminée ##################"

# Comparaison des md5sum des premiers 2Mo et derniers 2 Mo 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 -r siz typ fic
do
#	while [ $siz -gt 4000000 ]
	if [ $siz -gt 4000000 ]
	then
#	do
#  concaténer 4Mo = 2 head + 2 tail, un seul md5 sur les 4 Mo reconstitués
#	   printf "%10s:%s\n" "$siz" "$(md5sum "head -c 2000000 "$fic" ; tail -c 2000000 "$fic"")"
	   printf "%10s:%s:%s\n" "$siz" "$((head -c 2000000 "$fic" ; tail -c 2000000 "$fic") | md5sum | head -c 32)" "$fic"
#	   echo "  $fic"
#	   read -r siz typ fic
#	done 
	else
# un seul md5 sur les fichiers <=4 Mo
      	   printf "%10s:%s:%s\n" "$siz" "$(md5sum "$fic" | head -c 32)" "$fic"
	fi
done </tmp/tmp1.$$ |sort -rn | uniq -D -w43 >/tmp/tmp2.$$
# si > 4 Mo et toujours dans liste après md5 concaténé : calcul md5 complet 
echo "###################### Étape 2 terminée ##################"

# Comparaison des md5sum des fichiers complets
while IFS=: read -r siz md5 fic
do 
	if [ $siz -gt 4000000 ]
	then
      	   printf "%10s:%s:%s\n" "$siz" "$(md5sum "$fic" | head -c 32)" "$fic"
	else
	   printf "%10s:%s:%s\n" "$siz" "$md5" "$fic" 
	fi
done </tmp/tmp2.$$ | sort -rn | uniq -D -w43 >/tmp/tmp1.$$
echo "###################### Étape 3 terminée ##################"

OUTF=rem-duplicates.sh;
#echo "#! /bin/bash" > $OUTF;
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"\""}}'>> $OUTF
#rm \1/' >> $OUTF;
#chmod a+x $OUTF; ls -l $OUTF
echo "###################### Étape 4 terminée ##################"

C'est loin d'être propre, ce n'est pas optimisé, mais ça semble prometteur 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

#28 Le 21/11/2015, à 10:22

Brunod

Re : awk : problème formatage nombres

Aie, la commande stat coince lorsque le répertoire est plus conséquent :

root@kalimero:~/NAS/IsoCD# ls -R | wc
  37463   38612  496721
root@kalimero:~/NAS/IsoCD# 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 | sed 's/:.*://'
 728705024 BT-Kali-Secu/bt3-final.iso
 728705024 BT-Kali-Secu/Backtrack3.iso
        69 BT-Kali-Secu/kali-linux-1.0.9-i386.txt.sha1sum
        69 BT-Kali-Secu/kali-linux-1.0.8-i386.txt.sha1sum
        69 BT-Kali-Secu/kali-linux-1.0.7-i386.txt.sha1sum
        69 BT-Kali-Secu/kali-linux-1.0.6-i386.txt.sha1sum
root@kalimero:~/NAS/IsoCD# shopt -s globstar
root@kalimero:~/NAS/IsoCD# 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 | sed 's/:.*://'
bash: /usr/bin/stat: Liste d'arguments trop longue
root@kalimero:~/NAS/IsoCD# stat -c "%10s %n" **/* bash: /usr/bin/stat: Liste d'arguments trop longue

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


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

Hors ligne

#29 Le 21/11/2015, à 10:34

pingouinux

Re : awk : problème formatage nombres

Aie, la commande stat coince lorsque le répertoire est plus conséquent :

Je t'avais prévenu… smile (voir la première remarque en #22)

Hors ligne

#30 Le 21/11/2015, à 11:39

Brunod

Re : awk : problème formatage nombres

C'est vrai ! smile Mais je ne pensais pas que cela serait si vite considéré comme "très peuplé". Je l'ai testé sur un répertoire de taille moyenne (82Go)...
Je vais approfondir. Merci encore de ton soutien.


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

Hors ligne

#31 Le 21/11/2015, à 11:57

credenhill

Re : awk : problème formatage nombres

hello
remplacer

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

par

 find * -printf "%10s %p\n"

Hors ligne

#32 Le 21/11/2015, à 14:36

pingouinux

Re : awk : problème formatage nombres

En tenant compte de la remarque de credenhill #31, j'ai remplacé find ... -exec stat ... par find ... -printf ....

#!/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 -printf "%10s@%p\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 |
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"\""}}'

rm /tmp/tmp1.$$

Hors ligne

#33 Le 22/11/2015, à 08:26

Brunod

Re : awk : problème formatage nombres

Merci credenhill et pingouinux ! Ça fonctionne. Par contre, c'est lent (>50 min pour 82 Go), et avec md5 sur 1ko, j'ai beaucoup de faux doublons.
Je vais tester quelques variantes. smile

Dernière modification par Brunod (Le 22/11/2015, à 09: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

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

Brunod

Re : awk : problème formatage nombres

Bon, je m'arrête ici :

#!/bin/bash
# FONCTIONNEL 
# test répertoire isocd distant 82Go : 54m58; 
# Comparaison des tailles et des md5sum de 4000 octets des fichiers
while IFS=@ read -r siz fic
do
   printf "%s@%s@%s\n" "$siz" "$(md5sum < <(head -c 2000000 "$fic" ; tail -c 2000000 "$fic"))" "$fic"
#   printf "%s@%s@%s\n" "$siz" "$(md5sum < <(head -c 10000 "$fic"))" "$fic"
done < <(find "$@" -type f -printf "%10s@%p\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 |
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""}}' > rem-duplicates.sh
cat rem-duplicates.sh 
#chmod a+x $OUTF; ls -l $OUTF
rm /tmp/tmp1.$$

Le résultat est bon sur une machine locale mais sur un nas distant, ce n'est pas encore parfait. Je vais chercher une alternative.
Merci !


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

Hors ligne

#35 Le 22/11/2015, à 21:44

pingouinux

Re : awk : problème formatage nombres

Voici ma dernière version, dans laquelle on peut choisir le nombre d'octets en début de fichier sur lesquels on calcule le premier md5sum (variable a_tester), et le nombre de chiffres décimaux de la plus grande taille des fichiers (variable lon).
On ne traite pas les répertoires /proc et /sys (fichiers spéciaux).
Comme tu l'avais fait, j'ai ajouté un test pour ne calculer qu'une seule fois le md5sum des petits fichiers.

Ce que j'obtiens :
  21 Go : 0' 59"
121 Go : 3' 32"
151 Go : 89'

#!/bin/bash

a_tester=1000; lon=10

# Comparaison des tailles et des md5sum des "$a_tester" premiers octets des fichiers
while IFS=@ read -r siz fic
do
   [[ $fic =~ ^/proc/ || $fic =~ ^/sys/ ]] && continue
   printf "%s@%s@%s\n" "$siz" "$(md5sum < <(head -c $a_tester "$fic"))" "$fic"
done < <(find "$@" -type f -printf "%${lon}s@%p\n" | sort -t@ -k1,1nr | uniq -D -w$lon) | sort -t@ -k1,1nr -k2,2 | uniq -D -w$((lon+33)) >/tmp/tmp1.$$

# Comparaison des md5sum des fichiers complets
while IFS=@ read -r siz md5 fic
do
   if ((siz>a_tester)); then
      md5_fic=$(md5sum "$fic")
   else
      md5_fic="$(sed 's/  -//' <<<"$md5")  $fic"
   fi
   printf "%s@%s\n" "$siz" "$md5_fic"
done </tmp/tmp1.$$ | sort -t@ -k1,1nr -k2,2 | uniq -D -w$((lon+33)) |
awk 'BEGIN{print"#!/bin/sh"}{if(s!=$1){t=$1;sub("@.*","",t);printf("\n# Longueur : %'$lon's\n",t);s=$1}{$1="";sub(" ","");print"#rm \""$0"\""}}'

rm /tmp/tmp1.$$

Hors ligne

#36 Le 23/11/2015, à 10:36

Brunod

Re : awk : problème formatage nombres

Voici le résultat toujours sur le même répertoire de 82Go (nas distant qui n'a pas de /proc /sys) :
real    69m58.986s
user    2m19.569s
sys    0m41.583s
Je m'abstiendrai de le lancer sur la racine du nas (4To de data), mais de toute manière, telle n'était pas mon intention wink


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

Hors ligne

#37 Le 27/12/2015, à 23:45

Brunod

Re : awk : problème formatage nombres

Je poste de mon gsm et serai bref : il est pratique d'ajouter des guillemets pour délimiter les commandes rm des doublons dont les noms ont des espaces, sans quoi, le simple fait de dé-commenter une ligne ne suffit pas à la rendre active.
Je posterai plus tard.
Edit : voila.

#!/bin/bash
# FONCTIONNEL V. 25/12/2015
# attention aux espaces et ' dans noms; mettre entre guillemets
# Comparaison des tailles et des md5sum des premiers 4Mo des fichiers
while IFS=@ read -r siz fic
do
   printf "%s@%s@%s\n" "$siz" "$(md5sum < <(head -c 2000000 "$fic" ; tail -c 2000000 "$fic"))" "$fic"
#   printf "%s@%s@%s\n" "$siz" "$(md5sum < <(head -c 10000 "$fic"))" "$fic"
done < <(find "$@" -type f -printf "%10s@%p\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 |
awk 'BEGIN{print"#!/bin/bash"}{if(s!=$1){t=$1;sub("@.*","",t);printf("\n# Longueur : %10s\n",t);s=$1}{$1="";sub(" ","");print "#rm \""$0"\""}}' > rem-duplicates.sh
cat rem-duplicates.sh 
#chmod a+x $OUTF; ls -l $OUTF
rm /tmp/tmp1.$$

Ce petit script est très utile pour faire un nettoyage ciblé sur certains répertoires, il m'a permis de récupérer 1/8ème de la capacité de stockage sur un nas.
Merci !

Dernière modification par Brunod (Le 05/01/2016, à 13:11)


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

Hors ligne

#38 Le 29/10/2017, à 17:15

Brunod

Re : awk : problème formatage nombres

Bonjour à tous (et à Pingouinux),
J'en reviens à ce script que j'utilise toujours régulièrement :

#!/bin/bash
# V. 23/10/2017 Se lance dans l'arborescence à examiner
# https://forum.ubuntu-fr.org/viewtopic.php?id=1943451
# Comparaison des tailles et des md5sum sur les (10000) 10 Koctets ou 2 Mo de début et finaux des fichiers
while IFS=@ read -r siz fic
do
   printf "%s@%s@%s\n" "$siz" "$(md5sum < <(head -c 2000000 "$fic" ; tail -c 2000000 "$fic"))" "$fic"
#   printf "%s@%s@%s\n" "$siz" "$(md5sum < <(head -c 10000 "$fic"))" "$fic"
done < <(find "$@" -type f -printf "%10s@%p\n" | sort -rn | uniq -D -w10) | sort -t@ -k1,1nr -k2,2 | uniq -D -w43 >/tmp/tmp1.$$
# non récursif ou récursif selon -maxdepth 1 ou absent
# done < <(find "$@" -maxdepth 1 -type f -printf "%10s@%p\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 |
awk 'BEGIN{print"#!/bin/bash"}{if(s!=$1){t=$1;sub("@.*","",t);printf("\n# Longueur : %10s\n",t);s=$1}{$1="";sub(" ","");print "#rm \""$0"\""}}' > _0rem-duplicates.sh
cat _0rem-duplicates.sh 
# chmod a+x $OUTF; ls -l $OUTF
rm /tmp/tmp1.$$

J'ai bricolé une variante bien utile non récursive pour ne pas descendre dans l'arborescence avec -maxdepth 1 dans

done < <(find "$@" -maxdepth 1 -type f -printf "%10s@%p\n" | sort -rn | uniq -D -w10) | sort -t@ -k1,1nr -k2,2 | uniq -D -w43 >/tmp/tmp1.$$

mais je dois chaque fois éditer le fichier pour cocher/décocher la ligne avec/sans cette option.

Serait-il possible d'injecter deux paramètres :
- le chemin dans lequel l'action doit avoir lieu
- une option pour choisir au lancement du script (par exemple, -r) s'il sera récursif pour descendre dans l'arborescence ou s'il  restera par défaut au niveau du répertoire d'appel ?
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

#39 Le 29/10/2017, à 18:08

pingouinux

Re : awk : problème formatage nombres

Bonjour Brunod,

Serait-il possible d'injecter deux paramètres :
- le chemin dans lequel l'action doit avoir lieu
- une option pour choisir au lancement du script (par exemple, -r) s'il sera récursif pour descendre dans l'arborescence ou s'il  restera par défaut au niveau du répertoire d'appel ?

Le find fait déjà la recherche dans les répertoires que tu donnes en arguments de ton script (le répertoire courant par défaut).

Pour la récursivité, tu peux ajouter -r en premier argument du script, et modifier ceci :
1) Au début du script, tu ajoutes

if [ "$1" = -r ]; then
   recursif=""
   shift
else
   recursif="-maxdepth 1"
fi

2) Tu remplaces la ligne du find par

done < <(find "$@" $recursif -type f .....)

Hors ligne

#40 Le 29/10/2017, à 18:39

Brunod

Re : awk : problème formatage nombres

Merci Pingouinux ! smile
Je regarde pour adapter.

Edit : Pingouinux, c'est parfait ! Encore une fois, je te remercie smile
Bruno

Dernière modification par Brunod (Le 29/10/2017, à 18:52)


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

Hors ligne