42 votes

Équivalent Linux de robocopy ?

C'est un peu drôle, il y a beaucoup de façons dont les outils de ligne de commande Linux sont nettement supérieurs à ceux de Windows, mais une chose à laquelle je n'ai pas trouvé d'équivalent est robocopy. Robocopy est beaucoup plus polyvalent que cp, et je ne peux pas trouver comment faire ce que je veux avec des outils Linux.

Un cas d'utilisation spécifique est que j'ai deux répertoires avec des fichiers principalement similaires, mais l'un a des fichiers source plus récents et l'autre a des fichiers de contenu que l'autre répertoire n'a pas, et éventuellement des fichiers source plus récents (pour un site web). Je veux copier les fichiers du dernier répertoire dans le premier, en ajoutant de nouveaux fichiers de contenu, mais sans écraser les fichiers plus récents dans le répertoire de destination.

J'ai essayé de trouver comment faire cela sur Linux pendant peut-être une demi-heure, j'ai décidé que je devrais probablement apprendre le bash scripting ou quelque chose pour faire ce que je voulais, et puis j'ai réalisé que je pouvais simplement utiliser robocopy. J'avais aussi d'autres exigences. Je convertissais essentiellement un site web Python (Django) d'un référentiel SVN à un référentiel Git, et je voulais m'assurer de ne pas avoir de modifications non validées dans SVN. Cependant, je voulais exclure conditionnellement les répertoires .svn et les fichiers Python compilés .pyc. La commande robocopy suivante fait exactement ce que je veux :

robocopy source destination /XO /E /XD .svn /XF *.pyc

Y a-t-il un équivalent à Robocopy sous Linux ? J'ai jeté un coup d'œil à rsync brièvement, mais il semblait que je devrais mettre en place un serveur rsync avant de tenter de synchroniser les dossiers.

41voto

ChrisR Points 303

Il semble que rsync est certainement ce que vous cherchez. Vous n'avez pas besoin de configurer un 'serveur rsync' pour copier des fichiers d'une machine à une autre. Rsync prend en charge la copie de fichiers via SFTP (SSH File Transfer), ce que la plupart des boîtes Linux ont déjà activé (sauf s'ils ont été désactivés manuellement).

Consultez Miroir de fichiers entre systèmes avec rsync sur Lifehacker pour plus de détails :

Que vous souhaitiez sauvegarder vos données, distribuer des fichiers de manière sécurisée ou miroiter vos documents de travail sur internet du bureau à la maison, entre ordinateurs sur votre réseau local, ou de votre ordinateur à votre serveur web, rsync peut faire le travail. Aujourd'hui, nous allons utiliser rsync pour miroiter des dossiers entre un Mac et un PC sur une connexion sécurisée en ligne de commande.

Rsync est gratuit (au sens de la liberté) et multiplateforme, ce qui signifie qu'il synchronise les fichiers entre différents systèmes d'exploitation (Windows/Cygwin, Mac OS, Linux) ; il fonctionne via ssh donc il est chiffré et sécurisé ; contrairement au FTP, il est incrémentiel, donc seuls les parties des fichiers modifiés sont transférés, pas l'intégralité des fichiers, ce qui le rend ultra-rapide ; et le fait qu'il fonctionne en ligne de commande le rend scriptable et facilement automatisable.

18voto

Daniel Moura Points 4298

Rsync copiera des fichiers d'un répertoire vers un autre répertoire sur la même machine comme robocopy. Voici la commande rsync qui est équivalente à votre commande robocopy :

rsync -auv --exclude '.svn' --exclude '*.pyc' source destination

Cela copiera récursivement la source vers la destination et exclura les fichiers/dossiers plus anciens ainsi que les répertoires/fichiers '*.svn' et '*.pyc'.

1voto

Si vous pouvez vivre sans exclure les répertoires .svn et les fichiers .pyc, et si aucun de vos noms de fichiers et répertoires ne contient d'espaces, alors vous pouvez simplement utiliser cp à l'invite de commande GNU/Linux :

cp -uaT source destination

source et destination sont des répertoires.

  • L'option -u garantit que seules les versions plus récentes de source remplaceront les fichiers existants dans destination. Voir https://superuser.com/a/341296.
  • L'option -a, alias "archive", copie de manière récursive les répertoires dans source tout en préservant les horodatages et les autorisations, etc.
  • L'option -T garantit que nous copions le contenu de source dans répertoire, et non pas le répertoire source lui-même.

Il est important d'utiliser la version GNU de cp, car certaines de ces options peuvent être différentes ou non disponibles dans d'autres versions UNIX, par exemple, macOS.

Si vous avez des espaces dans vos noms de fichiers ou de répertoires, vous pouvez utiliser rsync comme d'autres l'ont mentionné, ou rediriger find avec -print0 vers xargs avec -0, ce que vous pouvez explorer, mais qui dépasse le cadre de cette réponse. Les deux possibilités permettent des exclusions.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X