scpまたはsftpは単一のコマンドで複数のファイルをコピーします


314

別のディレクトリにあるリモートサーバーとの間でファイルをコピーしたいのですが。たとえば、これらの4つのコマンドを一度に実行したいとします。

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

それを行う最も簡単な方法は何ですか?


14
スクリプトを作成するとき、コマンドごとにパスワードを入力する必要がありました。回避できますか?
user987654

11
このようにパスワードを繰り返すことは避けてください:scp remote: "A / 1.txt A / 2.txt B / 1.txt C /
1.txt

stackoverflow.com/a/23748561/874188(この1つの複製として指定されている)には、優れた追加テクニックがあります。
Tripleee 2016

2
をご覧になることをお勧めしますrsync。おそらく、このケースや今後の多くのケースで役立つかもしれません。次に、パスワードの入力を回避するために(複数回は言うまでもありません)、ssh公開鍵/秘密鍵についてお読みください。例:digitalocean.com/community/tutorials/how-to-set-up-ssh-keys--2
mnagel

1
@JohnMuddの回答に基づく例: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' ./
エドゥアルドルシオ

回答:


420

リモートからローカルに複数のファイルをコピーします。

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

ローカルからリモートに複数のファイルをコピーします。

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

リモートからリモートに複数のファイルをコピーします。

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

ソース:http : //www.hypexr.org/linux_scp_help.php


5
最初のコマンドは末尾の「。」を省略し、 '{a、b、c}'は\ {a、b、c \}と同じです。
duleshi 2014

11
OPは、複数のローカルフォルダーにある複数のファイルを複数のリモートフォルダーにコピーしようとしていると思います。これらの例はすべてファイルをscpする~か、またはファイル./のみをscpするため、機能しません。
aesede 2015

20
注意:中括弧内のコンマの後にスペースを入れないでください。私は10分間費やして、コマンドが機能せず、スペースが原因である理由を突き止めました。
ディーパック

13
リモートからローカルにコピーする場合、@ duleshi {a、b、c}は\ {a、b、c \}と完全には等しくありません。最初のファイルは各ファイルのパスワードを必要とし、2番目のパスワードは1回だけ必要です。
Marcelo Ventura

15
@ MarceloVentura、@ duleshi:また、使用\{a,b,c\}するとファイルが1つの接続/バッチで転送されます(リモートホストでファイルが展開されるため)。使用{a,b,c}すると複数の接続が開かれ、オーバーヘッドは多くのファイルを転送する場合は非常に目立つ
omn​​inonsense

140

ローカルからサーバーへ:

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

サーバーからローカルへ:

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


6
サーバーが各ファイルのパスワードを要求しないので、これが一番の答えになるはずです:)
motagirl2

Ubuntu 18(zsh)のクライアントでは機能しません。これが機能する場所がわからない。`` `(venv)➜git:(master)✗scp root @ 172.29..xxx.yyy:" / usr / local / bin / kubectl /root/.kube/config "/ tmp / root @ 172.29..xxx。 yyyのパスワード:プロトコルエラー:ファイル名がリクエスト `` `と一致しません
jseguillon

3
@ motagirl2バックスラッシュで中括弧をエスケープしている限り、トップの回答は各ファイルのパスワードを要求しません。この回答により、ファイルが見つからないというエラーが発生します。
冥王星

1
@jseguillon -Tそのエラーを抑制するオプションを追加します。
モニカを復活

1
2つ目は私のマシンで動作しますが、-Tオプションを使用しない場合のみ
Richard DiSalvo '29

71

-rスイッチを使用してディレクトリ全体をコピーできるため、ファイルを独自のディレクトリに分離できる場合は、すべてを一度にコピーできます。

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

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

だから例えば

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

または、数が少ない場合は、次のように使用できます。

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

これは、宛先がルートで、etcディレクトリを次のように実行している場合に機能しますか。scp -r / backups / etc root @ linuxbox:/ここで、ソースは「hosts」やnginx / sitesなどの非常に疎なディレクトリです。 -利用可能など?
戸町

47

Jiriが述べたように、scp -r user@host:/some/remote/path /some/local/pathファイルを再帰的にコピーするために使用できます。これは、転送したいすべてのファイルを含む単一のディレクトリがあることを前提としています(他には何もありません)。

ただし、SFTPは、複数の異なるディレクトリからファイルを転送する必要があり、宛先が同一でない場合に代替手段を提供します。

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

これは、「here doc」構文を使用して、SFTP入力コマンドのシーケンスを定義します。別の方法として、SFTPコマンドをテキストファイルに入れて実行することもできます。sftp user@host -b batchFile.txt


3
これが実際に質問に答える唯一の答えです。ありがとう。私はscpこの機能を見つけるのに非常に長い間マニュアルをグーグルで分析してきましたが、scpにはそれがないと思います。
sudo

1
これが最良で最も柔軟な答えのようです。注:/home/vagrant/Code/ではなくフルパスを使用する必要があることに気づくまで、私はつまずきました~/Code/
ライアン

これが最良の答え- rです。ディレクトリに追加することを忘れないでください
Chris_Rands '27

25

での答えは{file1,file2,file3}bashでのみ機能します(リモートまたはローカル)。

実際の方法は次のとおりです。

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

1
素晴らしい!私は非bashシェルを時々使用していますが、これは計り知れないほど役立ちます。実際の方法だけでなく、正しい方法。
ポールB.

1
{…, …, …}Bashだけでなく、多くのシェルで動作するように動作します。ただし、これはどのシェルでも機能するため、明らかに優れています。
Piotr Dobrogost 2018年

より多くの引用が必要です。これらのパスにはスペースを含めることができます。
アミットNaidu

1
いきます!私は何度も賛成票を投じますが、私は一度だけそれを行うことができます!ヴーズありがとうございます!
アンドレ・パチェコ

17

しばらくscpで遊んだ後、私は最も堅牢なソリューションを見つけました:

(一重引用符と二重引用符に注意してください)

ローカルからリモートへ:

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

ローカルからリモート:

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

「HOST:」の後はリモートに送信され、そこで解析されることに注意してください。したがって、ローカルシェルによって処理されないようにする必要があります。そのため、単一引用符が使用されます。二重引用符は、ファイル名のスペースを処理するために使用されます。

ファイルがすべて同じディレクトリにある場合は、*を使用してすべてを一致させることができます。

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

一部のシェルでのみサポートされている「{}」構文を使用する場合と比較すると、これは普遍的です


ファイル名にスペースを使用していただきありがとうございます。私は{}アプローチを使用していたので、引用後に\でエスケープする必要もありました。
Noumenon

3
パスのホームディレクトリにチルダ文字(〜)を使用する場合。〜と/が引用符の外にある必要があることに注意してください。`` `scp -r robwaa@192.168.1.101: '〜/" bin / set-vpn-kill-switch "〜/" bin / flush-iptables "'〜/" "` ``
Rob Waa

{}構文は次のとおりでこれを行うにはどのような方法があり、それが簡単に同じディレクトリから複数のファイルをコピーすることができますscp -rそれはので"FILE1" "FILE2"、ファイルへの相対パスと絶対パスではないことができますか?
dtasev

15

最も簡単な方法は

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

したがって、{..}リストにはディレクトリを含めることができます(A、B、およびCはディレクトリです。「1.txt」および「2.txt」はこれらのディレクトリ内のファイル名です)。

これらの4つのファイルすべてを1つのローカルディレクトリにコピーしますが、それが目的のものかどうかはわかりません。

上記の場合、リモートファイルA / 1.txt、A / 2.txt、B / 3.txt、C / 4.txtが単一のローカルディレクトリにコピーされ、ファイル名は./1.txtになります。 ./2.txt、./3.txt、./4.txt


これにより、ローカルマシンのA / 1.txtの内容がB / 1.txtの内容で上書きされませんか?
Yves Dorfsman、2016年

良い点..例を調整し(上書きしないように)、説明を追加しました。ありがとう。
Tagar

このような中括弧の拡張はBashの機能であり、POSIXなどには移植できませんsh
tripleee 2016

1
@tripleee、ありがとう。posixではないかもしれませんが、bashだけで機能するわけではありません。私はいつもkshを使っており、そこでも動作します。
Tagar

1
また、実行してdirsにし、ファイルを混在させることができます:local$ scp -r remote:{A/1.txt,A/2.txt,B/3.txt,C/4.txt,D,F} ./
donhector

13

問題:単一のSCPコマンドを使用してリモートサーバーからローカルマシンに複数のディレクトリをコピーし、各ディレクトリをリモートサーバー内に保持します。

解決策:SCPはこれを簡単に行うことができます。これにより、複数のフォルダでSCPを使用するときにパスワードを複数回入力するという煩わしい問題が解決されます。その結果、これにより時間も大幅に節約されます。

例えば

# 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\}  .

PS:このすばらしい答えに動機づけられた:scpまたはsftpは単一のコマンドで複数のファイルをコピー


コメントに基づいて、これはWindowsのGit Bashでもうまく機能します


3
PSはアイテム間にスペースを追加しません。つまり、\ {t1、t2、t3 \} ------>ここで10分無駄になりました...笑
ケンバークレー

1
中括弧をエスケープすると、によって単一のコマンドとして解釈され、転送ごとにパスワードを要求しないため、これが最良の答えです
Amaynut

@Amaynutはい、まさに!それは確かに多くの時間と労力を節約します:)
kmario23

12

複数のディレクトリをコピーします。

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

問題は、リモートディレクトリからローカルディレクトリにコピーする方法でした。
Tagar

5

あなたはこのようにすることができます:

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

これにより、リストされているすべてのファイル名が、ローカルディレクトリにダウンロードされます。

各ファイル名の間にスペースを入れないでください,。カンマのみを使用してください。


1
これは、拡張子が同じ場合に適しています。/path/to/files/\\{file1.ext,file2.ext,file3.ext\\}ファイルの拡張子が異なるかのように書くことができます。あなたが使用する必要があります(MSはパーティーに参加したことになりました)PowerShellの人々への注意`:代わりにエスケープする/path/to/files/`{file1.ext,file2.ext,file3.ext`}
dtasev

3

注:上記の質問の一部にのみ回答したことをあらかじめお詫びします。しかし、私はこれらのコマンドが私の現在のUNIXニーズに役立つことがわかりました。

ローカルマシンからリモートマシンへの特定のファイルのアップロード:

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

ディレクトリ全体をローカルマシンからリモートマシンにアップロードします。

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

リモートマシンからローカルマシンにディレクトリ全体をダウンロードします。

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


3

私の場合、sftpコマンドの使用のみに制限されています。
そのため、sftpでバッチファイルを使用する必要がありました。以下のようなスクリプトを作成しました。これは、/ tmpディレクトリで作業していて、ファイルをリモートシステムのdestdir_on_remote_systemに配置することを前提としています。これは、非対話型ログインでのみ機能します。パスワードを入力せずにログインできるように、公開鍵/秘密鍵を設定する必要があります。必要に応じて変更します。

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

コマンドは完璧に機能しますが、ローカルをリモートに送信するときにファイル名も変更したいと思います。私はコマンドを書きました:-sshpass -p password scp /path/to/file.txt root @ hostname:/path/newfile.txt

しかし、それは/path/newfile.txtというエラーを出します:plzがこのような状況で私を助けてくれるようなファイルまたはディレクトリが見つかりません


リモートディレクトリがhostname:/path/実際に存在し、アクセス可能であることを確認してください。
アミットNaidu

1

scpは、sshを使用して同じ認証でデータを転送し、sshと同じセキュリティを提供します。

ここでのベストプラクティスは、「SSH鍵と公開鍵認証」を実装することです。これにより、認証を気にすることなくスクリプトを記述できます。そのような単純な。

参照してください。SSH-KEYGEN IS WHAT


1

すべてのファイルの拡張子が同じで、サフィックス(ログファイルの数など)が異なる特定のケースでは、以下を使用します。

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

これにより、some_log_fileという名前のすべてのファイルがリモート内の特定のフォルダーからコピーされます。つまり、some_log_file.1、some_log_file.2、some_log_file.3 ...


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

おかげで、それは単なる例であり、実際のファイルまたはディレクトリ名はより複雑です。しかし、私はそれらのリストを持っています。
user987654

それらを正規表現で説明できますか?
unxnut 2013年

正規表現を使用してターゲットディレクトリに同じディレクトリ構造を保持することは可能ですか?
user987654

1
はい、-rオプションでそれを行うことができるはずscpです。また、-pオプションで他の属性(タイムスタンプなど)を保持できます。
unxnut 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.