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?
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/
Du local au serveur:
scp file1.txt file2.sh [email protected]:~/pathtoupload
Du serveur au local:
scp [email protected]:"file1.log file2.log" "~/yourpathtocopy"
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
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
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
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
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
Copier plusieurs répertoires:
scp -r dir1 dir2 dir3 [email protected]:~/
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
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/
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
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
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
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 ....
scp remote:"[A-C]/[12].txt" local: