web-dev-qa-db-fra.com

scp ou sftp copier plusieurs fichiers avec une seule commande

Je voudrais copier des fichiers de/vers le serveur distant dans des répertoires différents. Par exemple, je veux exécuter ces 4 commandes à la fois.

scp remote:A/1.txt local:A/1.txt
scp remote:A/2.txt local:A/2.txt
scp remote:B/1.txt local:B/1.txt
scp remote:C/1.txt local:C/1.txt

Quel est le moyen le plus simple de le faire?

265
user987654

Copier plusieurs fichiers de distant à local:

$ scp [email protected]:/some/remote/directory/\{a,b,c\} ./

Copier plusieurs fichiers de local à distant:

$ scp foo.txt bar.txt [email protected]:~
$ scp {foo,bar}.txt [email protected]:~
$ scp *.txt [email protected]:~

Copier plusieurs fichiers de distant à distant:

$ scp [email protected]:/some/remote/directory/foobar.txt \
[email protected]:/some/remote/directory/

Source: http://www.hypexr.org/linux_scp_help.php

362
ios.id0

Du local au serveur:

scp file1.txt file2.sh [email protected]:~/pathtoupload

Du serveur au local:

scp [email protected]:"file1.log file2.log" "~/yourpathtocopy"

90
Gtr_py

Vous pouvez copier des répertoires entiers en utilisant le commutateur -r. Ainsi, si vous pouvez isoler vos fichiers dans votre propre répertoire, vous pouvez tout copier en même temps.

scp -r ./dir-with-files user@remote-server:upload-path

scp -r user@remote-server:path-to-dir-with-files download-path

donc par exemple

scp -r [email protected]:/var/log ~/backup-logs

Ou s'il n'y en a que quelques-uns, vous pouvez utiliser:

scp 1.txt 2.txt 3.log user@remote-server:upload-path
60
Jiri Kremser

Comme Jiri l'a mentionné, vous pouvez utiliser scp -r user@Host:/some/remote/path /some/local/path pour copier des fichiers de manière récursive. Cela suppose qu’un seul répertoire contient tous les fichiers que vous souhaitez transférer (et rien d’autre).

Cependant, SFTP offre une alternative si vous souhaitez transférer des fichiers de plusieurs répertoires différents et que les destinations ne sont pas identiques:

sftp user@Host << EOF
  get /some/remote/path1/file1 /some/local/path1/file1
  get /some/remote/path2/file2 /some/local/path2/file2
  get /some/remote/path3/file3 /some/local/path3/file3
EOF

Ceci utilise la syntaxe "here doc" pour définir une séquence de commandes d'entrée SFTP. Vous pouvez également placer les commandes SFTP dans un fichier texte et exécuter sftp user@Host -b batchFile.txt

45
alev

Les réponses avec {file1,file2,file3} ne fonctionnent qu'avec bash (à distance ou localement)

Le vrai moyen est:

scp user@remote:'/path1/file1 /path2/file2 /path3/file3' /localPath
18
Vouze

Le plus simple est

local$ scp remote:{A/1,A/2,B/3,C/4}.txt ./

Donc, la liste {..} peut inclure des répertoires (A, B et C sont des répertoires; "1.txt" et "2.txt" sont des noms de fichiers dans ces répertoires).

Bien que cela puisse copier tous ces quatre fichiers dans un répertoire local - vous ne savez pas si c'est ce que vous souhaitiez.

Dans le cas ci-dessus, les fichiers distants A/1.txt, A/2.txt, B/3.txt et C/4.txt sont copiés dans un seul répertoire local, avec les noms de fichier ./1.txt, ./2.txt, ./3.txt et ./4.txt

14
Tagar

Après avoir joué avec scp pendant un moment, j'ai trouvé la solution la plus robuste:

(Attention aux guillemets simples et doubles)

Local à distance:

scp -r "FILE1" "FILE2" Host:'"DIR"'

Distant au local:

scp -r Host:'"FILE1" "FILE2"' "DIR"

Notez que quoi que ce soit après "Host:" sera envoyé à la télécommande et analysé là-bas. Nous devons donc nous assurer qu'ils ne sont pas traités par le Shell local. C'est pourquoi les guillemets simples entrent en jeu. Les guillemets doubles sont utilisés pour gérer les espaces dans les noms de fichiers.

Si les fichiers se trouvent tous dans le même répertoire, nous pouvons utiliser * pour les faire correspondre, tels que

scp -r "DIR_IN"/*.txt Host:'"DIR"'
scp -r Host:'"DIR_IN"/*.txt' "DIR"

Comparé à l'utilisation de la syntaxe "{}" qui n'est supportée que par certains shells, celle-ci est universelle

12
eosphorox

Copier plusieurs répertoires:

scp -r dir1 dir2 dir3 [email protected]:~/
12
yuliskov

Problème : Copie de plusieurs répertoires d'un serveur distant vers une machine locale à l'aide d'une seule commande SCP et conservation de chaque répertoire tel qu'il se trouve sur le serveur distant.

Solution : SCP peut le faire facilement. Cela résout le problème ennuyeux de la saisie d'un mot de passe plusieurs fois lors de l'utilisation de SCP avec plusieurs dossiers. En conséquence, cela permet également de gagner beaucoup de temps!

par exemple.

# copies folders t1, t2, t3 from `test` to your local working directory
# note that there shouldn't be any space in between the folder names;
# we also escape the braces.
# please note the dot at the end of the SCP command

~$ cd ~/working/directory
~$ scp -r [email protected]:/work/datasets/images/test/\{t1,t2,t3\}  .

PS: motivé par cette excellente réponse: scp ou sftp copier plusieurs fichiers avec une seule commande


Sur la base des commentaires, cela fonctionne également très bien dans Git Bash sous Windows

12
kmario23

REMARQUE: Je m'excuse par avance de n'avoir répondu qu'à une partie de la question ci-dessus. Cependant, j'ai trouvé ces commandes utiles pour mes besoins actuels sous Unix.

Téléchargement de fichiers spécifiques depuis un ordinateur local vers un ordinateur distant:

~/Desktop/dump_files$ scp file1.txt file2.txt lab1.cpp etc.ext [email protected]:Folder1/DestinationFolderForFiles/

Télécharger un répertoire complet depuis un ordinateur local vers un ordinateur distant:

~$ scp -r Desktop/dump_files [email protected]:Folder1/DestinationFolderForFiles/

Télécharger un répertoire entier depuis une machine distante sur une machine locale:

~/Desktop$ scp -r [email protected]:Public/web/ Desktop/

3
fat43r 80ard

votre commande fonctionne parfaitement, mais je souhaite également modifier le nom du fichier lors de l'envoi local à distant. J'ai écrit une commande: - sshpass -p motdepasse scp /path/to/file.txt root @ nomhôte: /path/newfile.txt

Mais cela donne l’erreur que /path/newfile.txt: Aucun fichier ou répertoire trouvé plz ne m’aide dans cette situation

2
Reshmi K C

Dans mon cas, je suis limité à l’utilisation de la commande sftp.
J'ai donc dû utiliser un fichier batch avec sftp. J'ai créé un script tel que le suivant. Cela suppose que vous travaillez dans le répertoire/tmp et que vous souhaitez placer les fichiers dans le système destdir_on_remote_system du système distant. Cela fonctionne également uniquement avec une connexion non interactive. Vous devez configurer des clés publiques/privées pour pouvoir vous connecter sans entrer de mot de passe. Changer au besoin.

#!/bin/bash

cd /tmp
# start script with list of files to transfer
ls -1 fileset1* > batchfile1
ls -1 fileset2* >> batchfile1

sed -i -e 's/^/put /' batchfile1
echo "cd destdir_on_remote_system" > batchfile
cat batchfile1 >> batchfile
rm batchfile1

sftp -b batchfile user@Host
2
dminear

scp utilise ssh pour le transfert de données avec la même authentification et fournit la même sécurité que ssh.

Une meilleure pratique consiste à mettre en œuvre "SSH KEYS AND PUBLIC KEY AUTHENTICATION". Avec cela, vous pouvez écrire vos scripts sans vous soucier de l’authentification. Aussi simple que cela.

Voir WHAT IS SSH-KEYGEN

1
augusto

Dans le cas spécifique où tous les fichiers ont la même extension mais avec un suffixe différent (par exemple le numéro du fichier journal), vous utilisez les éléments suivants:

scp [email protected]:/some/log/folder/some_log_file.* ./

Ceci copiera tous les fichiers nommés some_log_file du dossier indiqué dans la télécommande, c’est-à-dire some_log_file.1, some_log_file.2, some_log_file.3 ....

1
Guy Avraham
scp remote:"[A-C]/[12].txt" local:
0
unxnut