#!/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, (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