J'ai deux copies d'un dossier
src/
dest/
Je veux les fusionner en procédant comme suit:
Si un fichier se trouve uniquement dans src
, je souhaite qu'il soit déplacé versdest
Si un fichier est uniquement dans dest
, je veux qu'il soit ignoré IE laissé seul.
Si un fichier est dans les deux et a un contenu identique (IE même taille et date), supprimez desrc
Si un fichier est dans les deux et n'a pas un contenu identique, laissez-le src
dedans pour que je puisse les fusionner manuellement.
Seul un très petit nombre de fichiers (entre 0% et 5% du nombre total de fichiers) devrait appartenir à cette dernière catégorie, mais je ne sais pas comment séparer le dans les deux et le même dans les deux, mais différent.
J'ai essayé de comprendre comment le faire, rsync
mais en vain jusqu'à présent.
for file in `find src/ -type f`; do diff $file `echo $file | sed 's/src/dest/'` && rm $file || echo $file; done
(vous pouvez ignorer le|| echo $file
si vous le souhaitez, il est inclus pour être complet)\?*[
initial-
). Vous devez utiliser des guillemets doubles autour des substitutions de variables , passer--
aux utilitaires avant les noms de fichiers, utiliserfind … -exec …
au lieu d'analyser la sortie defind
. Avec unerm
commande dans le mélange, c'est une recette pour un désastre.l'unisson est l'outil que vous recherchez. Essayez unison-gtk si vous préférez un gui. Mais je ne pense pas que cela supprimera des fichiers similaires: essayez à l'unisson d'avoir les deux répertoires identiques. Néanmoins, il 1) identifiera facilement les fichiers à copier; 2) lesquels nécessitent une fusion manuelle.
la source
Le script suivant devrait faire les choses raisonnablement. Il déplace les fichiers de la source vers la destination, sans jamais écraser un fichier et créer des répertoires si nécessaire. Les fichiers source qui ont un fichier différent correspondant dans la destination sont laissés seuls, tout comme les fichiers qui ne sont pas des fichiers ou des répertoires normaux (par exemple des liens symboliques). Les fichiers restants dans la source sont ceux pour lesquels il existe un conflit. Attention, je ne l'ai pas testé du tout.
Une autre approche serait de faire un montage d'union un répertoire au-dessus de l'autre, par exemple avec funionfs ou unionfs-fuse .
la source