compare-repcompare-rep a pour but de comparer deux répertoire et de supprimer les fichiers qui sont dans le premier et non dans le deuxième. Le comportement peut être récursif (ne l'est pas par défaut).
compare-rep est distribué sous licence libre CeCILL.
Une fois le fichier téléchargé, vous devez
sudo mv compare-rep /usr/local/bin/
sudo chmod +x /usr/local/bin/compare-rep
$ compare-rep -h
Usage : compare-rep [-rn] REP1 REP2
compare-rep -h
Vérifie les fichiers de REP1 et propose d'en supprimer ceux qui ne sont pas
dans REP2. Seul les noms des fichiers sont vérifiés. Le script déplace les
fichiers concernés dans le répertoire /tmp/compare-rep/.
Sans les options -q ou -v, seuls les noms des répertoires et les décomptes de
fichiers à modifier sont affichés.
Options :
-h : afficher cette aide
-n : mode sans écriture ('dry-run'), liste seulement les actions à effectuer
-r : comportement récursif
-q : mode silencieux, aucune sortie
-v : mode verbeux complet, affiche la liste de tous les fichiers concernés
#!/bin/bash
# This software is governed by the CeCILL license under French law and
# abiding by the rules of distribution of free software. You can use,
# modify and/ or redistribute the software under the terms of the CeCILL
# license as circulated by CEA, CNRS and INRIA at the following URL
# "http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt".
#
# Ce logiciel est régi par la licence CeCILL soumise au droit français et
# respectant les principes de diffusion des logiciels libres. Vous pouvez
# utiliser, modifier et/ou redistribuer ce programme sous les conditions
# de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
# à l'adresse "http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt".
#
# Copyright Cyril Ravat, <ravat@free.fr> (2011)
# Website : http://www.cyril-ravat.fr/scripts/compare-rep.php
# Help : compare-rep -h
# Options par défaut
# Mode sans action
DRYRUN=
# Mode récursif
RECUR=
# Mode verbeux
VERBOSE=1
# Répertoire de déplacement
DEPL="/tmp/compare-rep/"
# Options du script
while getopts ":hnrqv" option
do
case $option in
"h")
echo "Usage : $(basename "$0") [-rn] REP1 REP2"
echo " $(basename "$0") -h"
echo
echo -e "Vérifie les fichiers de \033[1mREP1\033[0m et propose d'en supprimer ceux qui ne sont pas"
echo -e "dans \033[1mREP2\033[0m. Seul les noms des fichiers sont vérifiés. Le script déplace les"
echo -e "fichiers concernés dans le répertoire \033[1m$DEPL\033[0m."
echo -e "Sans les options \033[1m-q\033[0m ou \033[1m-v\033[0m, seuls les noms des répertoires et les décomptes de"
echo "fichiers à modifier sont affichés."
echo
echo "Options :"
echo -e " \033[1m-h\033[0m : afficher cette aide"
echo -e " \033[1m-n\033[0m : mode sans écriture ('dry-run'), liste seulement les actions à effectuer"
echo -e " \033[1m-r\033[0m : comportement récursif"
echo -e " \033[1m-q\033[0m : mode silencieux, aucune sortie"
echo -e " \033[1m-v\033[0m : mode verbeux complet, affiche la liste de tous les fichiers concernés"
echo
exit 0
;;
"n") DRYRUN=1 ; OPTS="${OPTS}n" ;;
"r") RECUR=1 ; OPTS="${OPTS}r" ;;
"q") VERBOSE=0 ; OPTS="${OPTS}q" ;;
"v") VERBOSE=2 ; OPTS="${OPTS}v" ;;
"?") break ;;
esac
done
shift $((OPTIND-1))
[ -n "$OPTS" ] && OPTS="-$OPTS"
# Vérification de l'existence des répertoires
REP1="${1%/}"
REP2="${2%/}"
[ ! -d "$REP1" ] && echo "Erreur : $REP1 n'est pas un répertoire valide." && exit 2
[ ! -d "$REP2" ] && echo "Erreur : $REP2 n'est pas un répertoire valide." && exit 2
# Création du répertoire de déplacement
[ $DRYRUN ] || ( [ ! -d "$DEPL" ] && mkdir "$DEPL" || rm -rf "$DEPL/*" )
# Traitement
N=0
M=0
for FICHIER in "$REP1"/*; do
# Comportement récursif
if [ -d "$FICHIER" ]; then
[ $RECUR ] && $0 $OPTS "$FICHIER" "$REP2/$(basename "$FICHIER")"
# Traitement des fichiers
else
if [ -e "$REP2/$(basename "$FICHIER")" ]; then
[ $VERBOSE = 2 ] && echo " GARDE $FICHIER"
[ $VERBOSE -eq 1 ] && (( N+=1 ))
else
[ $VERBOSE = 2 ] && echo " SUPPR $FICHIER"
[ $DRYRUN ] || mv "$FICHIER" "$DEPL"
[ $VERBOSE -eq 1 ] && (( M+=1 ))
fi
fi
done
# Affichage groupé par répertoire
if [ $VERBOSE -eq 1 ] ; then
[ $DRYRUN ] && echo " ===== $REP1 -> $N à garder, $M à supprimer" || echo " ===== $REP1 -> $N gardés, $M supprimés"
fi