scp veya sftp tek komutla birden fazla dosya kopyalama


314

Dosyaları farklı dizinlerdeki uzak sunucudan / uzak sunucuya kopyalamak istiyorum. Örneğin, bu 4 komutu bir kerede çalıştırmak istiyorum.

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

Bunu yapmanın en kolay yolu nedir?


14
Bir senaryo hazırladığımda, her komut için şifre koymak zorunda kaldım. Bundan kaçınabilir miyim?
user987654

11
Şifreyi şu şekilde tekrarlamaktan kaçının: scp remote: "A / 1.txt A / 2.txt B / 1.txt C / 1.txt" yerel: ./
JohnMudd

stackoverflow.com/a/23748561/874188 (bunun bir kopyası olarak aday gösterildi) hoş bir ek tekniğe sahip.
tripleee

2
Bir göz atmanızı öneririm rsync, belki bu durumda ve yaklaşan birçok durumda size yardımcı olabilir. Ardından, şifrelerin girilmesini önlemek için (birden çok kez) ssh, genel / özel anahtarlar hakkında okumalısınız , örneğin digitalocean.com/community/tutorials/how-to-set-up-ssh-keys--2
mnagel

1
Örnek @JohnMudd 'ın Yanıta göre: scp root@192.168.56.120:'/etc/openvpn/ca.crt /etc/openvpn/client/client0.crt /etc/openvpn/client/client0.key /etc/openvpn/client/ta.key' ./.
Eduardo Lucio

Yanıtlar:


420

Birden çok dosyayı uzaktan yerel ayarlara kopyalayın:

$ scp your_username@remote.edu:/some/remote/directory/\{a,b,c\} ./

Birden çok dosyayı yerelden uzaktan kumandaya kopyalayın:

$ scp foo.txt bar.txt your_username@remotehost.edu:~
$ scp {foo,bar}.txt your_username@remotehost.edu:~
$ scp *.txt your_username@remotehost.edu:~

Birden çok dosyayı uzaktan kumandadan uzaktan kumandaya kopyalayın:

$ scp your_username@remote1.edu:/some/remote/directory/foobar.txt \
your_username@remote2.edu:/some/remote/directory/

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


5
İlk komut "." Ve "{a, b, c}" sonunu atladı \ \ a, b, c \} 'e eşittir.
duleshi

11
Bence OP birden çok yerel klasördeki birden fazla dosyayı birden çok uzak klasöre kopyalamaya çalışıyor, bu örnekler işi yapmayacak, çünkü hepsi dosyaları scp olarak ~ya da ./sadece.
aesede

20
Dikkat: Kıvırcık parantez içindeki virgüllerden sonra boşluk bırakmayın. Komutumun neden çalışmadığını ve boşluklar yüzünden olduğunu anlamaya çalışmak için sadece 10 dakika harcadım.
deepak

13
@duleshi {a, b, c}, uzaktan kumandadan lokal olarak kopyalama yaparken \ {a, b, c \} ile tam olarak eşit değildir, çünkü ilki her dosya için parola gerektirir, ikincisi ise yalnızca bir kez parola gerektirir.
Marcelo Ventura

15
@MarceloVentura, @duleshi: Ayrıca, kullanmanın \{a,b,c\}, dosyaları tek bir bağlantıda / toplu işte (uzak ana bilgisayarda genişletilecekleri için) aktarırken, {a,b,c}birden çok bağlantı açacağını ve ek yükün birçok dosyayı aktarırken oldukça dikkat çekici
omninonsense

140

Yerelden sunucuya:

scp file1.txt file2.sh username@ip.of.server.copyto:~/pathtoupload

Sunucudan yerel:

scp -T username@ip.of.server.copyfrom:"file1.txt file2.txt" "~/yourpathtocopy"


6
Sunucu her dosya için parola istemediğinden, bu üstteki yanıt olmalıdır :)
motagirl2

Ubuntu 18'de (zsh) istemci üzerinde çalışmıyor. Bunun nerede çalışması gerektiğinden emin değilim. `` (venv) ➜ git: (master) ✗ scp kökü @ 172.29..xxx.yyy: "/ usr / local / bin / kubectl /root/.kube/config" / tmp / root @ 172.29..xxx. yyy'nin şifresi: protokol hatası: dosya adı isteği `` ``
jseguillon

3
@ motagirl2 Üstteki yanıt, eğik parantezleri ters eğik çizgiden kaçtığınız sürece her dosya için parola istemez. Bu yanıt bana dosyanın bulunamadığına dair bir hata veriyor.
Pluto

1
@jseguillon -TBu hatayı baskılama seçeneğini ekleyin .
Monica

1
ikincisi makinelerimde çalışıyor ancak sadece -T seçeneği olmadan
Richard DiSalvo

71

-rAnahtarlarınızı kullanarak dizinlerin tümünü kopyalayabilirsiniz, böylece dosyalarınızı kendi dizinine ayırabilirseniz, her şeyi aynı anda kopyalayabilirsiniz.

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

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

örneğin

scp -r root@192.168.1.100:/var/log ~/backup-logs

Veya bunlardan sadece birkaçı varsa, şunları kullanabilirsiniz:

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

Hedefim kök ise ve örneğin gibi dizini yapıyorum: scp -r / backups / etc root @ linuxbox: / burada benim kaynak "hosts" ve nginx / sites gibi şeylerle çok seyrek bir dizin -kullanılabilir vb?
Tomachi

47

Jiri'nin belirttiği gibi, scp -r user@host:/some/remote/path /some/local/pathdosyaları özyinelemeli olarak kopyalamak için kullanabilirsiniz . Bu, aktarmak istediğiniz tüm dosyaları içeren (ve başka bir şey olmayan) tek bir dizin olduğunu varsayar.

Ancak, birden fazla farklı dizinden dosya aktarmak istiyorsanız ve hedefler aynı değilse SFTP bir alternatif sunar:

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

Bu, bir SFTP giriş komut dizisini tanımlamak için "here doc" sözdizimini kullanır . Alternatif olarak, SFTP komutlarını bir metin dosyasına koyabilir vesftp user@host -b batchFile.txt


3
Soruyu gerçekten cevaplayan tek cevap bu. Teşekkürler. scpBu özelliği bulmaya çalışırken çok uzun süre Googling ve kılavuzu analiz ediyorum ve sanırım scp'de yok.
sudo

1
Bu en iyi, en esnek cevap gibi görünüyor. Not: Bunun /home/vagrant/Code/yerine tam bir yol kullanmam gerektiğini fark edene kadar takıldım ~/Code/.
Ryan

Bu en iyi cevap, sadece - rdizinler için eklemeyi unutmayın
Chris_Rands

25

{file1,file2,file3}İle yanıtlar yalnızca bash ile çalışır (uzaktan veya yerel olarak)

Gerçek yol:

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

1
Fantastik! Bazen bash olmayan mermiler kullanıyorum ve bu ölçülemez bir şekilde yardımcı oluyor. Sadece gerçek yol değil, doğru yol.
Paul B.

1
Globbing {…, …, …}, sadece Bash'ta değil, birçok kabukta çalışır. Ancak bu herhangi bir kabukta çalışır, bu yüzden açıkça daha iyidir.
Piotr Dobrogost

Daha fazla alıntı gerekiyor. Bu yollar boşluk içerebilir.
Amit Naidu

1
Oraya gidiyoruz! Bunu birçok kez onaylıyorum, ama sadece bir kez yapabilirim! Teşekkürler Vouze!
André Pacheco

17

Bir süre scp ile oynadıktan sonra en sağlam çözümü buldum:

(Tek ve çift tırnak işaretlerine dikkat edin)

Yerelden uzaktan kumandaya:

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

Yerelden uzak:

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

"HOST:" 'dan sonra ne olursa olsun uzaktan kumandaya gönderilecek ve orada ayrıştırılacaktır. Bu yüzden bunların yerel kabuk tarafından işlenmediğinden emin olmalıyız. Bu nedenle tek tırnak işaretleri girilir. Çift tırnak işaretleri dosya adlarındaki boşlukları işlemek için kullanılır.

Dosyaların hepsi aynı dizindeyse, tümünü eşleştirmek için * kullanabiliriz, örneğin

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

Yalnızca bazı kabuklar tarafından desteklenen "{}" sözdizimi ile karşılaştırıldığında, bu evrenseldir


Dosya adlarındaki boşluklara yardımcı olduğunuz için teşekkür ederiz. {} Yaklaşımını kullanıyordum, bu yüzden alıntı yaptıktan sonra \ 'dan kaçmak zorunda kaldım.
Noumenon

3
Ana dizininiz için tilde karakterini (~) kullanmak istiyorsanız yollarda. ~ Ve / işaretlerinin tırnak işaretleri dışında olması gerektiğini unutmayın. `` scp -r robwaa@192.168.1.101: '~ / "bin / set-vpn-kill-switch" ~ / "bin / flush-iptables"' ~ / "" ``
Rob Waa

{}Sözdizimi ile bunu yapmanın bir yolu yoktur, daha kolay aynı dizinden birden fazla dosya kopyalamak için yapar scp -r, böylece "FILE1" "FILE2"dosyalara göreli yollar ve mutlak değildir yolları olabilir?
dtasev

15

En basit yol

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

Bu nedenle {..} listesi dizinleri içerebilir (A, B ve C burada dizinlerdir; "1.txt" ve "2.txt" bu dizinlerdeki dosya adlarıdır).

Her ne kadar bu dört dosyayı tek bir yerel dizine kopyalasa da - istediğiniz bu olduğundan emin değilsiniz.

Yukarıdaki durumda, A / 1.txt, A / 2.txt, B / 3.txt ve C / 4.txt dosyaları ./1.txt dosya adlarıyla tek bir yerel dizine kopyalanır. ./2.txt, ./3.txt ve ./4.txt


Bu, yerel makinedeki A / 1.txt içeriğinin üzerine B / 1.txt içeriğinin üzerine yazmaz mı?
Yves Dorfsman

iyi nokta .. düzeltilmiş örnek (şimdi üzerine yazmaz) ve açıklama ekledi. Teşekkürler.
Tagar

Bunun gibi ayraç genişletmeleri bir Bash özelliğidir ve örneğin POSIX için taşınabilir değildir sh.
tripleee

1
@tripleee, teşekkürler. posix olmayabilir, ama sadece bash'da işe yaramaz. Ben her zaman ksh kullanıyorum ve orada da çalışıyor.
Tagar

1
Ayrıca dizinleri ve dosyaları karıştırarak şunları yapabilirsiniz:local$ scp -r remote:{A/1.txt,A/2.txt,B/3.txt,C/4.txt,D,F} ./
donhector

13

Sorun : Tek bir SCP komutu kullanarak birden çok dizini uzak sunucudan yerel makineye kopyalama ve her dizini uzak sunucuda olduğu gibi tutma.

Çözüm : SCP bunu kolayca yapabilir. Bu, SCP'yi birden fazla klasörle kullanırken can sıkıcı şifreyi birçok kez çözer. Sonuç olarak, bu da çok zaman kazandırır!

Örneğin

# 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 username@contact.server.de:/work/datasets/images/test/\{t1,t2,t3\}  .

Not: Bu harika cevapla motive: scp veya sftp birden fazla dosyayı tek komutla kopyala


Yorumlara dayanarak , Windows'ta Git Bash'te de iyi çalışıyor


3
PS, öğeler arasına boşluk eklemez. ie \ {t1, t2, t3 \} ------> Burada on dakika harcadım ... lol
kenberkeley

1
Bu en iyi cevaptır çünkü parantezlerden kaçtığınızda tek bir komut olarak yorumlanacak ve her transfer için şifre istemeyecektir
Amaynut

@Amaynut evet, kesinlikle! Bu kesinlikle çok zaman ve çaba tasarrufu sağlar :)
kmario23 23:19

12

Birden çok dizini kopyala:

scp -r dir1 dir2 dir3 admin@127.0.0.1:~/

soru, uzak dizinden yerel dizine nasıl kopyalanacağıydı.
Tagar

5

Bu şekilde yapabilirsiniz:

scp hostname@serverNameOrServerIp:/path/to/files/\\{file1,file2,file3\\}.fileExtension ./

Bu işlem, listelenen tüm dosya adlarını bulunduğunuz yerel dizine indirir.

Her dosya adı arasına boşluk koymadığınızdan emin olun, sadece virgül kullanın ,.


1
Uzantı aynı olduğunda bu iyidir. /path/to/files/\\{file1.ext,file2.ext,file3.ext\\}Dosyaların farklı uzantıları varmış gibi yazılabilir . PowerShell kişilerine not (MS artık partiye katıldı) `bunun yerine kaçmak için kullanmanız gerekiyor :/path/to/files/`{file1.ext,file2.ext,file3.ext`}
dtasev

3

NOT: Yukarıdaki sorunun yalnızca bir kısmını yanıtladığım için şimdiden özür dilerim. Ancak, bu komutların mevcut unix ihtiyaçlarım için yararlı olduğunu gördüm.

Yerel bir makineden uzak bir makineye belirli dosyaları yükleme:

~/Desktop/dump_files$ scp file1.txt file2.txt lab1.cpp etc.ext your-user-id@remotemachine.edu:Folder1/DestinationFolderForFiles/

Bir dizinin tamamını yerel bir makineden uzak bir makineye yükleme:

~$ scp -r Desktop/dump_files your-user-id@remotemachine.edu:Folder1/DestinationFolderForFiles/

Bir dizinin tamamını uzak makineden yerel makineye indirme:

~/Desktop$ scp -r your-user-id@remote.host.edu:Public/web/ Desktop/


3

Benim durumumda, sadece sftp komutunu kullanmakla sınırlıyım.
Bu yüzden, sftp ile bir toplu iş dosyası kullanmak zorunda kaldım. Aşağıdaki gibi bir senaryo oluşturdum. Bu, / tmp dizininde çalıştığınızı ve dosyaları uzak sistemdeki destdir_on_remote_system içine koymak istediğinizi varsayar. Bu yalnızca etkileşimli olmayan bir oturum açma ile de çalışır. Parola girmeden oturum açabilmek için genel / özel anahtarlar ayarlamanız gerekir. Gerektiği gibi değiştirin.

#!/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

komutunuz mükemmel çalışıyor, ancak yerel olarak uzaktan kumandaya gönderirken dosya adını da değiştirmek istiyorum. Bir komut yazdım: - sshpass -p parola scp /path/to/file.txt root @ hostname: /path/newfile.txt

Ancak /path/newfile.txt hatası verir: plz bu durumda bana böyle bir dosya veya dizin bulunamadı yardım


Uzak dizinin hostname:/path/gerçekten var olduğundan ve erişilebilir olduğundan emin olun .
Amit Naidu

1

scp, aynı kimlik doğrulama ile veri aktarımı için ssh kullanır ve ssh ile aynı güvenliği sağlar.

Burada en iyi uygulama "SSH TUŞLARI VE KAMU ANAHTAR DOĞRULAMA" uygulamaktır. Bununla, komutlarınızı kimlik doğrulama hakkında endişelenmeden yazabilirsiniz. Bu kadar basit.

Bkz SSH-KEYGEN NEDİR


1

Tüm dosyaların aynı uzantıya sahip olduğu ancak farklı sonekle (günlük dosyası sayısını söyleyin) belirli bir durumda aşağıdakileri kullanırsınız:

scp user_name@ip.of.remote.machine:/some/log/folder/some_log_file.* ./

Bu, bazı_log_dosyası adlı tüm dosyaları uzaktan kumandadaki belirli bir klasörden, yani bazı_log_dosyası.1, bazı_log_dosyaları.2, bazı_log_dosyaları.3 ... kopyalar.


-1
scp remote:"[A-C]/[12].txt" local:

teşekkürler, ancak bu sadece bir örnektir ve gerçek dosya veya dizin adı daha karmaşıktır. Ama bunların bir listesi var.
user987654

Bunları düzenli bir ifade ile tarif edebilir misiniz?
unxnut

Hedef dizinde aynı dizin yapısını düzenli ifade kullanarak korumak mümkün mü?
user987654

1
Evet, bunu -rseçeneği ile yapabilmelisiniz scp. Ve -pseçenek ile diğer nitelikleri (zaman damgası gibi) koruyabilirsiniz .
unxnut
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.