2017-08-09 4 views
0

je le dossier A et le dossier BComparer les dossiers, Créer une archive des différences

Dossier A contient environ 100 fichiers tout le texte, js, php, etc. bash Ils sont stockés dans la racine du dossier et sous dossiers et autres sous-dossiers dans le dossier A.

Dossier B est une copie du dossier A, mais certains fichiers ont été mis à jour.

Est-il possible que je peux comparer A à B et de créer un fichier tar.gz contenant uniquement les fichiers qui ont été modifiés dans dossier B

je besoin de garder la structure du dossier intact lorsque le goudron. gz est créé.

Actuellement, j'utilise WinMerge pour vérifier les différences, mais je suis heureux d'examiner toutes les applications ou commandes Windows ou Linux qui vont vous aider.

Merci

Répondre

1

Cette ligne exclut les fichiers qui ne sont que dans l'un ou l'autre, mais crée le fichier tar.gz que vous voulez.

diff -rq folderA folderB | grep -v "^Only in" | sed "s/^.*and folderB/folderB/g" | sed "s/ differ//g" | tar czf output.tar.gz -T - 

Ventilées il va:

dif -rq folderA folderB 

Faites une diff récursive entre ces dossiers, reposeras à ce sujet - que la sortie des noms de fichiers. Exclure les lignes de sortie qui indiquent qu'un fichier est uniquement dans l'un des dossiers.

| grep -v "^Only in" 

Je suppose que d'après votre description, ce n'est pas un problème pour vous, mais les deux dossiers avec lesquels je jouais étaient un peu sales. Rejeter le premier bit de la sortie jusqu'à ce qu'il dise "et", puis le nom du deuxième dossier. Cela prend effectivement loin le deuxième nom du dossier ainsi, mais remplace alors le dans

| sed "s/ differ//g" 

Jeter le bit de fin de la sortie de diff.

| tar czf output.tar.gz -T - 

Dites à tar pour faire la chose. c == créer un fichier tar z signifie le compresser (zip) f signifie que le nom de fichier arrive bientôt. output.tar.gz est votre fichier de sortie -T signifie « obtenir les noms de fichiers à partir du fichier que je suis sur le point de vous dire » la - finale signifie « utiliser stdin à la place »

Je vous suggère de construire ce vous-même dans les différentes étapes afin que vous puissiez voir comment il est construit, et ce que la sortie de chaque étape est comme.

+0

Merci cela fonctionne, mais le résultat le fichier tar.gz a le dossierB comme premier dossier dans le fichier. Est-il possible de l'avoir seulement enregistrer la structure des fichiers et sous-dossiers. Ex: un niveau dans le dossierB? – Tom

+0

L'exécution de la commande dans le dossier B, la mise à jour des chemins utilisés et l'exclusion de output.tar.gz semble fonctionner. 'diff -rq ../folderA. | grep -v "^ Seulement dans" | sed "s/^.* et. \ /// g" | sed "s/diff // g" | tar czf output.tar.gz --exclude = *. tar.gz -T - ' – Tom