web-dev-qa-db-ja.com

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

別のディレクトリにあるリモートサーバーとの間でファイルをコピーしたいのですが。例えば、私はこれら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

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

239
user987654

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

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

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

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

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

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

出典: http://www.hypexr.org/linux_scp_help.php

330
ios.id0

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

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

サーバーからローカルへ

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

82
Gtr_py

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

scp -r ./dir-with-files [email protected]:upload-path

scp -r [email protected]:path-to-dir-with-files download-path

だから例えば

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

あるいは、それらがほんの少ししかない場合は、次のものを使用できます。

scp 1.txt 2.txt 3.log [email protected]:upload-path
58
Jiri Kremser

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

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

sftp [email protected] << 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 [email protected] -b batchFile.txtを実行することもできます。

41
alev

{file1,file2,file3}を使った答えはbashでのみ有効です(リモートまたはローカル)。

本当のやり方は:

scp [email protected]:'/path1/file1 /path2/file2 /path3/file3' /localPath
15
Vouze

最も簡単な方法は

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

14
Tagar

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

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

問題 :単一の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 [email protected]:/work/datasets/images/test/\{t1,t2,t3\}  .

シモンズ:この素晴らしい答えに動機付けられています: scpまたはsftpは単一のコマンドで複数のファイルをコピーします


コメントに基づいて、これは WindowsのGit Bashでも問題なく動作します

10
kmario23

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"

一部のシェルでのみサポートされている "{}"構文を使用するのに比べて、これは普遍的です。

7
eosphorox

注:上記の質問の一部にのみお答えしています。しかし、私はこれらのコマンドが私の現在のunixのニーズに役立つと思いました。

特定のファイルをローカルマシンからリモートマシンにアップロードする

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

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

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

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

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

3
fat43r 80ard

あなたのコマンドは完璧に動作しますが、ローカルからリモートに送信しながらファイル名を変更したいと思います。私はコマンドを書きました: - sshpass - pパスワードscp /path/to/file.txt root @ hostname:/path/newfile.txt

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

2
Reshmi K C

私の場合は、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 [email protected]
2
dminear

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

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

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

1
augusto

すべてのファイルの拡張子が同じでサフィックスが異なる(ログファイルの数など)特定の場合には、次のようにします。

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

これは、some_log_fileという名前のすべてのファイルをリモート内の指定されたフォルダからコピーします。つまり、some_log_file.1、some_log_file.2、some_log_file.3 ...です。

乾杯、

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