Comment copier tous les fichiers et répertoires, à l'exception de certains sur ssh?

23

En utilisant la ligne de commande Linux, j'utilise la scpcommande pour copier tous les fichiers et dossiers d'un certain répertoire. Cependant, je n'aime pas consommer de bande passante, pour copier des choses que je change rarement comme mon tiny_mcedossier. Quelle est l'astuce pour tout copier, mais sauter une courte liste de dossiers?

Michael Prokopec
la source

Réponses:

19

rsyncfonctionne correctement et, dans la plupart des cas, utilise SSH automatiquement comme protocole de transport. Il comparera les fichiers et ne téléchargera que ceux qui ont changé - mais vous pouvez également utiliser une liste d'exclusion pour spécifier les fichiers dans l'arborescence qui ne doivent en aucun cas être rsynchronisés.

Anthon
la source
rsync n'utilise pas SSH automatiquement - vous devez fournir les drapeaux "-e ssh" pour ce faire.
4
Oui. Sortie de Rsync 2.6.0 - Le shell distant par défaut est désormais "ssh" à moins que vous ne disiez à configure que vous voulez faire de quelque chose d'autre la valeur par défaut. samba.org/rsync
12

Vous pouvez essayer rsync qui copie uniquement les fichiers qui ont changé, fonctionne également via ssh.


la source
9

L'utilisation rsync --excludeest le choix le plus évident ici, mais si vous voulez vraiment envoyer quelques fichiers ou dossiers et avoir quelque chose de spécifique à exclure, vous pouvez utiliser le globing shell avec scp. Assurez-vous d'abord que les bonnes options de globalisation sont définies dans votre shell. Pour bash run shopt -s extglobet pour zsh use setopt ksh_glob. Alors quelque chose comme ça:

scp /path/to/folder/!(tiny_mce|other_folder|*.bak) user@host:target_path

... copierait tout dans le dossier source, à l'exception des éléments correspondant au modèle donné. De toute évidence, vous pouvez faire preuve de créativité avec cette partie.

Caleb
la source
7

rsync est une bonne solution, mais si vous cherchez une alternative:

Disons que nous avons un répertoire "test" contenant les répertoires "foo, bar, baz". Dans ces répertoires se trouvent un tas de types de fichiers différents:

test
|____bar
| |____1.jpg
| |____1.png
| |____1.txt
| |____2.jpg
| |____2.png
| |____2.txt
|____baz
| |____1.avi
| |____2.avi
| |____3.png
|____foo
| |____test.blah
|____test.txt

Nous voulons tout copier sauf les PNG

scp $(find /location/of/test -type f ! -name "*.png") # -> Note the logical NOT!!

Dans cet exemple, la commande mettra tous les fichiers dans le même répertoire de destination - ce n'est peut-être pas le comportement souhaité.

Anthon
la source
1
Notez que cette réponse ne fonctionne que si les noms de fichiers et de répertoires impliqués ne contiennent aucun caractère spécial shell (espace ou \[*?).
Gilles 'SO- arrête d'être méchant'
3

Un excellent outil que vous voudrez peut-être essayer est "lftp".

lftp sftp://etc.etc/ 
lftp> ls 
    --- remote listing ---
lftp> mirror -R -n local/ remote/

Vous pouvez également utiliser RSync sur ssh

rsync -avzp -e ssh /this/dir/  remoteuser@remotehost:/remote/dir/

Devrait marcher.

Kent Fredric
la source
0

Je viens de terminer d' écrire comment je préfère l' unisson à la synchronisation tous les jours, car il

  • n'a pas besoin d'un démon, autre que ssh pour le transport
  • me permet de modifier les fichiers de chaque côté à tout moment - plusieurs maîtres facilement, alors que je n'ai besoin que de pousser une demande de synchronisation d'un côté
  • Je suis un adepte en ce qui concerne les heures de modification, les attributs / autorisations, les liens logiciels, etc. Aucun problème avec cela; pour un projet, j'utilise même 4 miroirs, l'un étant un hôte cygwin. Voir mon exemple de configuration de crontab.
  • prend en charge les exclusions comme *.bak. Échantillons dans mon fichier de configuration
Marcos
la source
0

Utilisation de la copie sécurisée - scp

scp -r file user@host:

Pour copier plusieurs fichiers

scp /directory/* user@host:destinationPath

Pour copier certains fichiers

scp /directory/!(*.doc) user@host:destinationPath

Il copie le contenu du répertoire sauf les fichiers .doc

Yogeesh HT
la source
0

Je vous recommanderais certainement rsync.

rsync -vra --exclude = "ce que vous voulez exclure" -e ssh dossier utilisateur @ remotehost: / dossier

amit singh
la source
0

C'est ce qui a fonctionné pour moi lorsque je l'ai exécuté à partir du serveur de destination.

rsync -av --progress user@servername:/sourcefolder /destinationfolder --exclude thefoldertoexclude
user2373210
la source
0

Nous pouvons le faire en deux étapes pour ignorer le tiny_mcerépertoire. En supposant que tous les répertoires commencent par des lettres minuscules.

scp -r USER@HOSTNAME:~/FOLDER/[a-s]* .
scp -r USER@HOSTNAME:~/FOLDER/[u-z]* .

Modifiez également USER, HOSTNAME et FOLDER aux valeurs réelles.

Fady Ibrahim
la source