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時には他の驚くべき行動があります。基本的に、何をコピーするのかを理解するように求めていますが、その推測は想定と一致しない場合があります。試してみてください。期待どおりに動作せず、理由がわからない場合は、ローカルおよびリモートディレクトリのセットアップに関する詳細を投稿し、試したコマンドを入力します。
脚注:
前rsync2.6.0(2004年1月1日)、それは必要な-e sshことは次のように動作させるためのフラグをscp、それが時代遅れにデフォルト設定するのでRSHプロトコル。
scprsyncいくつかのフラグを共有しますが、オーバーラップはほんのわずかです。
使用する場合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/targethost~the/targetscp
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フィルターを追加することができます。