scp
ファイルのアップロードに使用したいのですが、ターゲットディレクトリが存在しない場合があります。
フォルダーを自動的に作成することは可能ですか?もしそうなら、どのように?そうでない場合、どのような代替方法を試すことができますか?
scp
ファイルのアップロードに使用したいのですが、ターゲットディレクトリが存在しない場合があります。
フォルダーを自動的に作成することは可能ですか?もしそうなら、どのように?そうでない場合、どのような代替方法を試すことができますか?
回答:
これは、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
時には他の驚くべき行動があります。基本的に、何をコピーするのかを理解するように求めていますが、その推測は想定と一致しない場合があります。試してみてください。期待どおりに動作せず、理由がわからない場合は、ローカルおよびリモートディレクトリのセットアップに関する詳細を投稿し、試したコマンドを入力します。
脚注:
前rsync
2.6.0(2004年1月1日)、それは必要な-e ssh
ことは次のように動作させるためのフラグをscp
、それが時代遅れにデフォルト設定するのでRSHプロトコル。
scp
rsync
いくつかのフラグを共有しますが、オーバーラップはほんのわずかです。
使用する場合SSH
、転送プロトコルとして、rsync
同じデフォルト値を使用します。ですから、と同様にscp
、デフォルトではリモートマシン上にローカルユーザーと同じ名前のユーザーがいると想定します。
rsync
のドキュメントページを、ログインするSSHキーを使用する方法を見つけることができませんでした。ログインにユーザー名/パスワードを使用したくない
rsync
ます。そして、はい、あなたもrsync
リモート側で必要です、ちょうどと同じようにscp
。SSHキーに関してrsync
は、実際にはデフォルト-e ssh
でSSH を使用しているため、キーを使用するようにセットアップされたキーがある場合scp
、それらrsync
も同様に機能します。
-r
は違いはありません。説明するシナリオは、ディレクトリをコピーしていて、ターゲットの親ディレクトリが存在する場合にのみ機能します。そのため、rsync foo/ u@h:~/
ターゲットディレクトリが作成されますfoo
が、rsync foo/ u@h:~/bar/
ターゲットディレクトリを作成しませんbar
。存在するbar/foo
場合にのみ作成されますbar/
。いずれにせよ、OPはファイルをアップロードしています。これが機能する場合でも、ディレクトリ全体に対してのみ機能します。
rsync file host:/foo/file
場合foo/
は失敗しますrsync file host:/foo/
が、ディレクトリを作成file
してそこに配置します。奇妙な。とにかく、あなたは非常に正しいですし、基本的なシナリオは機能します。
ファイルのグループをコピーする場合は、そうではありません。ディレクトリとその下のすべてのコンテンツをコピーする場合は、はい。このコマンドを考えます:
$ scp -pr /source/directory user@host:the/target/directory
on にdirectory
存在しない場合は作成されます。ただし、存在しない場合は、問題が発生する可能性があります。この場合の正確な結果は覚えていませんが、失敗することに備えてください。~/the/target
host
~the/target
scp
scp: /home/madmike/test_bin: No such file or directory
ターゲットディレクトリが失われるとすぐに、これは私のセットアップで壊れます。クライアントでcygwinを使用し、サーバーでRHEL 6.9を使用します。あなたのセットアップは何ですか?
私の知る限り、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
個々のファイルをコピーする場合、フラグはターゲットディレクトリの作成に役立ちません。
はい、できます。scpのmanページによると:
男scp
.....
-rディレクトリ全体を再帰的にコピーします。scpはツリートラバーサルで検出されたシンボリックリンクに従うことに注意してください。
....
scp -r foo/ u@h:~/bar
ためbar/foo
、リモートbar/
が存在する場合は作成しますが、存在しない場合は失敗します。
foo
内容を新しいディレクトリにコピーします/bar
。もちろん、名前は変更されていますが、OPが望んでいるものとは異なる場合があります。目的のマシンで作成された新しいツリー構造が目的のscp
場合、ジョブを実行しません。ツリーの特定のブランチからツリー構造を複製する場合は、その構造が作成されます。
scp -r file host:~/bar/
作成しませんbar/
。
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
mkdirコマンドでコマンドをチェーンし、作成したフォルダーを参照できます。
mkdir ~/new-folder/ && scp -P 22 <remote/url>:~/new-folder/
(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フィルターを追加することができます。