# \[shell\] Comparer deux arborescences

**URL:** <https://www.debian-fr.org/t/shell-comparer-deux-arborescences/66971>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 9:55 UTC](https://www.debian-fr.org/t/shell-comparer-deux-arborescences/66971 "2016-02-21T21:55:22Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![anon96191775](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/71c47a/32.png) [@anon96191775](https://www.debian-fr.org/u/anon96191775)\
**Post date:** [Février 21, 2016, 9:55 UTC](https://www.debian-fr.org/t/shell-comparer-deux-arborescences/66971/1 "2016-02-21T21:55:22Z")

</div>

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](https://www.debian-fr.org/play-it-installez-facilement-vos-jeux-sur-debian-t52902.html) 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 😉

---

<div class="post-metadata">

**Author:** ![kna](https://www.debian-fr.org/user_avatar/www.debian-fr.org/kna/32/5623_2.png) [@kna](https://www.debian-fr.org/u/kna)\
**Post date:** [Février 21, 2016, 9:55 UTC](https://www.debian-fr.org/t/shell-comparer-deux-arborescences/66971/2 "2016-02-21T21:55:24Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![anon96191775](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/71c47a/32.png) [@anon96191775](https://www.debian-fr.org/u/anon96191775)\
**Post date:** [Février 21, 2016, 9:55 UTC](https://www.debian-fr.org/t/shell-comparer-deux-arborescences/66971/3 "2016-02-21T21:55:25Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![kna](https://www.debian-fr.org/user_avatar/www.debian-fr.org/kna/32/5623_2.png) [@kna](https://www.debian-fr.org/u/kna)\
**Post date:** [Février 21, 2016, 9:55 UTC](https://www.debian-fr.org/t/shell-comparer-deux-arborescences/66971/4 "2016-02-21T21:55:27Z")

</div>

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

```auto
$ 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")
```

---

<div class="post-metadata">

**Author:** ![Dunatotatos](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/d/c2a13f/32.png) [@Dunatotatos](https://www.debian-fr.org/u/Dunatotatos)\
**Post date:** [Février 21, 2016, 9:55 UTC](https://www.debian-fr.org/t/shell-comparer-deux-arborescences/66971/5 "2016-02-21T21:55:42Z")

</div>

> [@kna](#):
>
> Ah non tiens, ça ne va pas t’indiquer un nouveau dossier, s’il est vide :

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 🙂

Pour info, une «&nbsp;Best practice&nbsp;» 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.
