Sous Ubuntu 12.04, je souhaite comparer 2 répertoires, par exemple folder1 / et folder2 / et copier tous les fichiers différents de folder3 /. Il existe également des fichiers imbriqués, les sous-répertoires correspondants doivent donc également être copiés.
Y at-il une seule commande qui pourrait m'aider? Je peux obtenir la liste complète des fichiers modifiés en cours d'exécution:
rsync -rcnC --out-format="%f" folder1/ folder2/
Mais rsync ne semble pas avoir la capacité d'exporter ces fichiers dans un répertoire cible différent. Puis-je diriger la liste vers cp ou un autre programme, afin que les fichiers soient copiés, alors que les répertoires sont également créés? Par exemple, j'ai essayé
rsync -rcnC --out-format="%f" folder1/ folder2/ | xargs cp -t folder3/
mais cela ne conserverait pas non plus les répertoires, il copierait simplement tous les fichiers dans folder3 /
diff -qr
etawk
pour construire la liste, alorsrsync
...rsync --include-from=FILE
option.Réponses:
Utilisez --compare-dest.
De la page de manuel:
vérifiez d'abord votre syntaxe avec --dry-run
Ensuite, une fois que vous êtes satisfait du résultat:
Ce lien explique bien la portée de --compare-dest.
la source
rsync -rcC --compare-dest=folder2/ folder1/ folder3/
rsync version 3.1.1 protocol version 31
sur mon local et rsync ne comprend pas les~/
chemins pour--compare-dest
param.--compare-dest
requis un chemin absolu.fonts/Makefile.in
fichier, ce qui est identique dans les deuxfolder2
etfolder1
dirs.Ce petit script devrait fonctionner:
Mais je pense aussi que l’analyse de la sortie de diff -qr serait une meilleure solution car elle vous donne le chemin et le nom de chaque fichier de manière cohérente.
MODIFIER
Ce serait une commande, votre commande légèrement modifiée. Mais cela créera
folder1
sous lefolder3
. Et cela ne fonctionne pas avec les chemins complets, mais le script ci-dessus ne fonctionne pas non plus avec les chemins complets.Je
\"
enrsync
pour le faire fonctionner avec des fichiers et des répertoires contenant des blancs. Testé sur Ubuntu 10.04. J'espère que ça aide.la source
C'est la forme la plus simple que je pourrais trouver, si vous êtes prêt à descendre
folder1
avant d'envoyer la commande.C'est l' option la plus lente , mais je pense qu'elle répond à vos exigences et qu'elle peut être exécutée à l'aide de noms de répertoires non relatifs:
J'ai laissé votre
rsync
commande originale seule, parce que vous avez dit qu'elle vous donnait la liste de fichiers correcte (et que mes fichiers de test sont évidemment différents des vôtres, je ne peux donc pas dire avec certitude que j'obtiendrais la liste de fichiers correcte si je déconnais. avec ça).Le
grep
est là pour supprimer les noms de répertoire de la sortie dersync
.La sortie de
grep
est ensuite transmise à un autre à l'rsync
aide dexargs
. Dans param,folder1/./{}
extra./
est utilisé pour indiquer à rsync de créer les répertoires relatifs en commençant par./{}
ignorerfolder1/
. En d'autres termes, cela évite de créerfolder3/folder1/
.Je n'ai pu tester cela que sur CentOS 6.4, mais autant que je sache, cela devrait fonctionner de la même manière dans Ubuntu 12.04.
EDIT: Je dois noter que la réponse de smithian est sans aucun doute meilleure, mais je voulais essayer de le faire avec votre
rsync
commande originale, car elle vous donnait le résultat souhaité.la source