[shell] Comparer deux arborescences

Le script que je vous propose ici sert à comparer deux arborescences pour repérer par rapport à celle de référence les répertoires/fichiers créés ainsi que les fichiers modifiés.

Je m’en sers essentiellement dans mon projet ./play.it pour repérer les fichiers modifiés/créés lors de sauvegardes ou de modification des options pour des jeux dont je n’ai pas accès au code source.

Voici la bête :

[code]#!/bin/sh -e

compare deux arborescences et retourne les différences

$1 = arborescence modifiée

$2 = arborecence de référence

dir_target="$(realpath “$1”)“
dir_source=”$(realpath “$2”)"

if [ ! -d “${dir_target}” ]; then
printf 'Erreur !\n’
printf ‘%s: répertoire introuvable.\n’ "${dir_target}"
fi
if [ ! -d “${dir_source}” ]; then
printf 'Erreur !\n’
printf ‘%s: répertoire introuvable.\n’ "${dir_source}"
fi

cd “${dir_target}”

find . -type d | while read dir; do
if ! [ -e “${dir_source}/$dir” ]; then
printf ‘nouveau répertoire : %s\n’ "${dir}"
fi
done

find . -type f | while read file; do
if ! [ -e “${dir_source}/$file” ]; then
printf ‘nouveau fichier : %s\n’ "${file}"
fi
done

find . -type f | while read file; do
if [ -n “$(diff -q “${file}” “${dir_source}/${file}” 2>/dev/null)” ]; then
printf ‘fichier modifié : %s\n’ "${file}"
fi
done

exit 0[/code]

Et un exemple d’utilisation :

$ find-diff ~/.local/share/games/planescape-torment /usr/local/share/games/planescape-torment nouveau répertoire : ./save fichier modifié : ./torment.log fichier modifié : ./torment.err


Vos commentaires et suggestions sont les bienvenus, et si vous réutilisez ce script ça me ferait plaisir de savoir à quoi il peut vous servir :wink:

Tu pouvais aussi faire un dépôt git sur ton dossier, un git status t’indiquerait les fichiers modifiés.

Je découvre git depuis peu, ce script est une adaptation des méthodes que j’utilisais avant de me mettre à utiliser git de façon régulière.

Script que je viens au passage d’actualiser, la version précédente ne fonctionnait qu’avec un chemin absolu pour le répertoire de référence, ou un chemin relatif au répertoire testé. Le passage par realpath permet de ne plus se soucier de ça.

Pour revenir à “git status”, il me donnerait les trois informations que je cherche ?
_liste des nouveaux répertoires
_liste des nouveaux fichiers
_liste des fichiers modifiés

Ah non tiens, ça ne va pas t’indiquer un nouveau dossier, s’il est vide :

$ mkdir new_folder
$ touch new_file
$ echo plop >> old_file 
$ git status
Sur la branche master
Modifications qui ne seront pas validées :
  (utilisez "git add <fichier>..." pour mettre à jour ce qui sera validé)
  (utilisez "git checkout -- <fichier>..." pour annuler les modifications dans la copie de travail)

	modifié :         old_file

Fichiers non suivis:
  (utilisez "git add <fichier>..." pour inclure dans ce qui sera validé)

	new_file

aucune modification n'a été ajoutée à la validation (utilisez "git add" ou "git commit -a")

Exactement le problème que je viens d’avoir.
La même version d’un même projet Python fonctionnait sur un ordi, mais pas sur l’autre. Je travaille sur un dépôt git, et les deux versions étaient bien à jour avec le dépôt (selon git).
Ton script m’a donc servi à découvrir qu’un répertoire vide existait sur l’un des deux PC. Merci :slightly_smiling:

Pour info, une “Best practice” lorsqu’on crée un nouveau répertoire dans un projet git veut qu’on ajoute un fichier .gitignore dans ce répertoire (même vide). Une telle manipulation évite le problème évoqué ici.