[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: administration



On Thu, 17 May 2001, Mathieu Gafro wrote:

> Bonjour,

Bonsoir !


> Recherche des fichiers en double !

ci joint un petit script qui fait ça. Il n'est pas garanti sans bugs, je
le dis tout de suite... :-)

Il calcule les sommes MD5 de chaque fichier dans le répertoire spécifié et
les compare entre elles.
Si elles sont égales, c'est qu'on  a le même fichier. ( pas complètement
vrai mais pas délirant non plus. Ce serait bien de comparer en plus la
taille, par exemple. Ou carrément faire un diff ou un cmp...)

C'est pas du shell de très haut vol mais tu peux t'en inspirer pour en
refaire un qui te convienne mieux. Genre changer le test "d'égalité" de
deux fichiers.

> Envoi d'un mail à leur propriétaire pour signaler le
> fichier

echo "Fichier en double $FICH_1 et $FICH_2" | mail utilisateur@ma_machine


> Possibilité de renommer le fichier en double avec une
> extension .double ou de le supprimer

Solution 1:
mv FICH_2 FICH_1.double
 et les triplets ? donc c'est pas top.

Solution 2:

avoir:
fichier.hop
fichier.hop.copie1
fichier.hop.copie2

etc ...
Donc boucle:

i=0
while [ -e $FICH_1.copie$i ]; do       -e comme 'existe'
let i=$i+1
done
mv $FICH_2 $FICH_1.copie$i



> Mais je n'ai aucune notion de script ! Si quelqu'un
> pouvais m'aider ! Si possible pas en perl car il est mal
> installé !

Comme cela a déja été dit , le shell fait ça très bien.

Attention à la syntaxe parfois un peu , euh , troublante
:)

man bash
man builtin  (fonctions de base)
et bien sur cf Bash-Programming Howto et Advanced Bash Programming


A+
Romain


--
You never learn anything by doing it right.
#!/bin/sh

# Ce script pipo est distribuable librement selon la licence GPL
# www.gnu.org/gpl.html

if [ $# -ne 1 ]; then
echo -e "Usage: $0 repertoire \n\n     repertoire:  repertoire dans lequel on cherche des doublets\n\n"
exit 0
fi

# Repertoire de test:
MON_REPERTOIRE=$1

# Liste des fichiers du repertoire, et des sous-répertoires.
# -type f : seulement les fichiers "normaux" , pas les répertoires, etc.
# on peut aussi avoir -maxdepth=1 pour ne pas plonger dans les sous répertoires de MON_REPERTOIRE
# ensuite, xargs execute md5sum sur chaque nom de fichier issu de find:
# <somme 1> nom de fichier 1
# <somme 2> nom de fichier 2
# <somme 3> nom de fichier 3
# puis sort trie tout cela selon le premier champ, à savoir la clé MD5.
MES_FICHIERS=`find $MON_REPERTOIRE -type f -print | xargs md5sum | sort`

NB=`echo $MES_FICHIERS | wc -w`
NB=$(( $NB/2 ))
# wc (word count) compte tous les mots, donc chaque fichier compte pour 2 puisqu'il
# y a le nom de fichier et la signature md5
# On notera l'emploi des doubles parenthèses pour signaler une évaluation arithmétique,
# Si on fait NB=$NB/2 on a "51/2" et pas 25


# affichage
echo " DEBUG : $NB $MES_FICHIERS"

i=1
# on fait un while et pas un for parce qu'on va sauter certaines valeurs.
while [ $i -le $NB ];do

# On extrait un nom de fichier et la somme correspondante:
	MA_SOMME=$( echo $MES_FICHIERS | cut -f $(($i*2-1)) -d ' ')
	MON_FICHIER=$( echo $MES_FICHIERS | cut -f $(($i*2 )) -d ' ')

echo " Debug: File=$MON_FICHIER Sum=$MA_SOMME "


# On va comparer avec les suivants. Puisqu'on a pris la peine de les ranger,
# les doublets se suivent.
	let j=$i+1

	MA_SOMME2=$( echo $MES_FICHIERS | cut -f $(($j*2-1)) -d ' ')
	MON_FICHIER2=$( echo $MES_FICHIERS | cut -f $(($j*2 )) -d ' ')


# Tant que les sommes MD5 du i-ème et du j-ème sont les mêmes:
	while [  $MA_SOMME2 = $MA_SOMME  ]; do

# On agit:
		echo "==> Les fichiers $MON_FICHIER et $MON_FICHIER2 sont identiques"

# Puis on passe au suivant:
		let j=$j+1 
# Sans dépasser le nombre d'entrées:
		if [ $j -ge $NB ]; then
			break
		fi
		MA_SOMME2=$( echo $MES_FICHIERS | cut -f $(($j*2-1)) -d ' ')
		MON_FICHIER2=$( echo $MES_FICHIERS | cut -f $(($j*2 )) -d ' ')


	done
	echo "DEBUG: j=$j"
# Une fois que les sommes diffèrent, c'est qu'on a fini une plage de fichiers
# identiques, et on passe aux suivants, en sautant les valeurs intermédiaires.
	let i=$j
done



Reply to: