Script compare-rep

Description

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).

Téléchargement

Télécharger compare-rep

compare-rep est distribué sous licence libre CeCILL.

Installation

Une fois le fichier téléchargé, vous devez

Aide en ligne

$ 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

Transcript

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