#26 Le 19/11/2015, à 17: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).
Hors ligne
#27 Le 20/11/2015, à 22:17
- Brunod
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).
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
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, à 09: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, à 09: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, à 09: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… (voir la première remarque en #22)
Hors ligne
#30 Le 21/11/2015, à 10:39
- Brunod
Re : awk : problème formatage nombres
C'est vrai ! 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, à 10: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, à 13: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, à 07: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.
Dernière modification par Brunod (Le 22/11/2015, à 08: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, à 16: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, à 20: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, à 09: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
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, à 22: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, à 12: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, à 16: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, à 17: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, à 17:39
- Brunod
Re : awk : problème formatage nombres
Merci Pingouinux !
Je regarde pour adapter.
Edit : Pingouinux, c'est parfait ! Encore une fois, je te remercie
Bruno
Dernière modification par Brunod (Le 29/10/2017, à 17: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