compare-rep
compare-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