scpは、存在しないディレクトリを作成できますか?


89

scpファイルのアップロードに使用したいのですが、ターゲットディレクトリが存在しない場合があります。

フォルダーを自動的に作成することは可能ですか?もしそうなら、どのように?そうでない場合、どのような代替方法を試すことができますか?

回答:


72

これは、rsyncできることの1つです。

rsync過去数年にリリースされたバージョンを使用している場合¹、その基本的なコマンド構文は次のようになりscpます:²

$ rsync -r local-dir remote-machine:path

これにより、リモートマシンにlocal-sourceその内容がコピーさ$HOME/path/local-dirれ、必要なディレクトリが作成されます。³

rsyncここにはいくつかの制限があり、特定の状況でこれが機能するかどうかに影響を与える可能性があります。たとえば、欠落しているリモートディレクトリの複数のレベルは作成されません。リモートで不足しているレベルを1つだけ作成します。rsync次のようなコマンドをコマンドの前に付けると、簡単に回避できます。

$ ssh remote-host 'mkdir -p foo/bar/qux'

$HOME/foo/bar/qux存在しない場合は、ツリーが作成されます。既に存在する場合、文句を言うことも悪いこともしません。

rsync時には他の驚くべき行動があります。基本的に、何をコピーするのかを理解するように求めていますが、その推測は想定と一致しない場合があります。試してみてください。期待どおりに動作せず、理由がわからない場合は、ローカルおよびリモートディレクトリのセットアップに関する詳細を投稿し、試したコマンドを入力します。


脚注

  1. rsync2.6.0(2004年1月1日)、それは必要な-e sshことは次のように動作させるためのフラグをscp、それが時代遅れにデフォルト設定するのでRSHプロトコル

  2. scprsyncいくつかのフラグを共有しますが、オーバーラップはほんのわずかです。

  3. 使用する場合SSH、転送プロトコルとして、rsync同じデフォルト値を使用します。ですから、と同様にscp、デフォルトではリモートマシン上にローカルユーザーと同じ名前のユーザーがいると想定します。


Mac OSXを使用していますが、ローカル側とリモート側の両方にrsyncをインストールする必要がありますか?
-AGamePlayer

検索rsyncのドキュメントページを、ログインするSSHキーを使用する方法を見つけることができませんでした。ログインにユーザー名/パスワードを使用したくない
-AGamePlayer

1
@AwQiruiGuo:Mac OS Xにはが付属していrsyncます。そして、はい、あなたもrsyncリモート側で必要です、ちょうどと同じようにscp。SSHキーに関してrsyncは、実際にはデフォルト-e sshでSSH を使用しているため、キーを使用するようにセットアップされたキーがある場合scp、それらrsyncも同様に機能します。
ウォーレンヤング

1
@WarrenYoung -rは違いはありません。説明するシナリオは、ディレクトリをコピーしていて、ターゲットの親ディレクトリが存在する場合にのみ機能します。そのため、rsync foo/ u@h:~/ターゲットディレクトリが作成されますfooが、rsync foo/ u@h:~/bar/ターゲットディレクトリを作成しませんbar。存在するbar/foo場合にのみ作成されますbar/。いずれにせよ、OPはファイルをアップロードしています。これが機能する場合でも、ディレクトリ全体に対してのみ機能します。
テルドン

1
はい、私も遊んでいます。ファイル名を指定すると失敗するようです。そのため、存在しないrsync file host:/foo/file場合foo/は失敗しますrsync file host:/foo/が、ディレクトリを作成fileしてそこに配置します。奇妙な。とにかく、あなたは非常に正しいですし、基本的なシナリオは機能します。
テルドン

35

ファイルのグループをコピーする場合は、そうではありません。ディレクトリとその下のすべてのコンテンツをコピーする場合は、はい。このコマンドを考えます:

$ scp -pr /source/directory user@host:the/target/directory

on にdirectory存在しない場合は作成されます。ただし、存在しない場合は、問題が発生する可能性があります。この場合の正確な結果は覚えていませんが、失敗することに備えてください。~/the/targethost~the/targetscp


1
scp: /home/madmike/test_bin: No such file or directoryターゲットディレクトリが失われるとすぐに、これは私のセットアップで壊れます。クライアントでcygwinを使用し、サーバーでRHEL 6.9を使用します。あなたのセットアップは何ですか?
MadMike

16

私の知る限り、scpそれ自体はできません。ただし、sshターゲットマシンにだけ移動して、ディレクトリを作成してからコピーできます。何かのようなもの:

ssh user@host "mkdir -p /target/path/" &&
    scp /path/to/source user@host:/target/path/

ディレクトリ全体をコピーする場合、上記は不要であることに注意してください。たとえば、ディレクトリ~/fooをリモートホストにコピーするには、-r(再帰)フラグを使用できます。

scp ~/foo/ user@host:~/

これ~/fooにより、リモートホストにターゲットディレクトリが作成されます。ただし、親ディレクトリを作成することはできません。scp ~/foo user@host:~/bar/fooターゲットディレクトリbarが存在しない限り失敗します。いずれにしても、-r個々のファイルをコピーする場合、フラグはターゲットディレクトリの作成に役立ちません。


3

はい、できます。scpのmanページによると:

男scp

.....

-rディレクトリ全体を再帰的にコピーします。scpはツリートラバーサルで検出されたシンボリックリンクに従うことに注意してください。

....


7
これは、ターゲットの親ディレクトリを作成しません。ディレクトリを既存の場所にコピーできます。そのscp -r foo/ u@h:~/barためbar/foo、リモートbar/が存在する場合は作成しますが、存在しない場合は失敗します。
テルドン

1
失敗しません。foo内容を新しいディレクトリにコピーします/bar。もちろん、名前は変更されていますが、OPが望んでいるものとは異なる場合があります。目的のマシンで作成された新しいツリー構造が目的のscp場合、ジョブを実行しません。ツリーの特定のブランチからツリー構造を複製する場合は、その構造が作成されます。
ヨミスモ

6
はい。ただし、これはディレクトリではなくファイルをコピーする場合にのみ機能します。scp -r file host:~/bar/作成しませんbar/
テルドン

3

btrfsスナップショットを転送する前に、次の機能を使用しますssh

check_remote_dir() {
        printf "\ntesting remote directory: '$1' "

        if ssh -p $PORT $ROOT@$REMOTE "[ ! -d $1 ]"; then
                printf "\nCreating: $1 on $ROOT@$REMOTE\n"
                ssh -p $PORT $ROOT@$REMOTE "mkdir -p $1"
        else
                printf "[OK]\n"
        fi
}

スクリプトで関数を呼び出すには:

check_remote_dir /my/remote/path


私はかなり同じことを行うが、私は手動で(セキュリティ上の理由から)パスワードを入力しなければならないので、私は...、少なくとも2回に分けて、それを入力し終わる
ステファン・ライヒ

0

mkdirコマンドでコマンドをチェーンし、作成したフォルダーを参照できます。

mkdir ~/new-folder/ && scp -P 22 <remote/url>:~/new-folder/

3
(1)質問には「自動的に」と書かれています。これは自動ではないようです。(2)これは、terdonの答えに対する些細な変化に過ぎないように思われます。
Gマン

0

(rsshによって)sshが使用できないscpまたはsftpのみに制限されている場合、rsyncで空のディレクトリツリーをコピーしてからファイルをコピーすることにより、ディレクトリを作成できます。

ssh-copy-idが機能せず、.sshディレクトリが存在しない場合、リモートホストに公開sshキーを配置する方法は次のとおりです。

rsync -e 'ssh -p22' -av -f"+ */" -f"- *" ~/.ssh backup@1.2.3.4:~/
scp -P22 ~/.ssh/id_rsa.pub backup@1.2.3.4:~/.ssh/authorized_keys

ターゲットファイル名が同じ場合、このコマンドを1つのrsyncに組み合わせて、中央にもう1つのincludeフィルターを追加することができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.