Sftpによるディレクトリ(他のディレクトリがいくつかのレベルに深い)のアップロードに問題があります。これをgzip圧縮することで回避できることはわかっていますが、なぜそれが必要なのかわかりません。
とにかく、
sftp> put bin/
Uploading bin/ to /home/earlz/blah/bin
bin/ is not a regular file
sftp> put -r bin/
Uploading bin/ to /home/earlz/blah/bin
Couldn't canonicalise: No such file or directory
Unable to canonicalise path "/home/earlz/blah/bin"
最後のエラーメッセージは完全に愚かだと思います。それで、ディレクトリは存在しませんか?ディレクトリを作成しませんか?
とにかく、この問題の周りにsftpがありますか、それともscpを使用するだけですか?
[〜#〜]修正済み[〜#〜]:OpenSSHがput -r
をサポートしていないと最初に誤って主張しました。ありますが、非常に奇妙な方法で行います。移動先のディレクトリは、移動元のディレクトリと同じ名前ですでに存在していると想定されているようです。
sftp> put -r source
Uploading source/ to /home/myself/source
Couldn't canonicalize: No such file or directory
etc.
sftp> mkdir source
sftp> put -r source
Uploading source/ to /home/myself/source
Entering source/
source/file1
source/file2
特に奇妙なのは、宛先に別の名前を付けた場合にもこれが当てはまることです。
sftp> put -r source dest
Uploading source/ to /home/myself/dest
Couldn't canonicalize: ...
sftp> mkdir dest
sftp> put -r source dest
Uploading source/ to /home/myself/dest/source
Couldn't canonicalize: ...
sftp> mkdir dest/source
sftp> put -r source dest
Uploading source/ to /home/myself/dest/source
Entering source/
source/file1
source/file2
よりよく実装された再帰的なput
の場合は、代わりにPuTTY psftp
コマンドラインツールを使用できます。 Debian(そしておそらくUbuntu)の下のPuTTY-tools
パッケージにあります。
あるいは、GUIを使用したい場合は、Filezillaが希望どおりの動作をします。
なぜsftpがこれを行うのかはわかりませんが、宛先ディレクトリがすでに存在する場合に限り、再帰的なコピーを行うことができます。これを行う...
sftp> mkdir bin
sftp> put -r bin
代わりにrsync
の使用に興味があるかもしれません。そのためのコマンドは
rsync --delete --rsh=ssh -av bin/ remote-ip-or-fqdn:/home/earlz/blah/bin/
これにより、bin/
のすべてがコピーされ、/home/earlz/blah/bin/
のリモートサーバーに配置されます。追加の利点として、最初にリモート側のファイルが変更されていないかどうかを確認し、変更されていない場合は再送信しません。さらに、-zオプションを追加すると、圧縮されます。
lcd
:ローカルフォルダ(サブフォルダあり)
cd
:リモートフォルダー
put -r .
圧縮せずにタールを含めて、やや複雑な答えを提案できますか?
さあ行こう:
tar -cf - ./bin | ssh target.org " ( cd /home/earlz/blah ; tar -xf - ) "
これにより、ディレクトリ./binがtar(-cf:= create file)、ファイル名-(none、stdout)でパックされ、ssh-commandを介してtarget.org(IPの場合もある)にパイプされる引用符で囲まれて実行されます。つまり、cd to blah、およびtar -xf(抽出ファイル)-なし、名前なし、stdinのみです。
それはまるで自宅でパッケージを梱包し、それをポストに持ってきて、それからあなたがパッケージを期待し、それを開けるところまで運転するようなものです。
おそらく、sftpを使用するだけのはるかにエレガントなソリューションがあるでしょう。
yafc を使用できます(まだFTP/SFTPクライアントです)。 -r
オプションはそこでうまく機能します。
rsyncを使用できます。これは、特にマシンAからマシンBにコピーを更新する場合、scpおよびsftpの非常に強力な代替手段です。 t変更されていないファイルをコピーします。また、マシンAから削除されたファイルをマシンBから削除することもできます(もちろん指示された場合のみ)。
例えば :
rsync -zrp /home/a/ [email protected]:/home/b/
-rオプションはファイルを再帰的にコピーするためのもので、-zは転送中に圧縮を有効にし、-pはコピー時にファイルのアクセス許可(ファイルの作成、編集など)を保持します。さらに多くのオプションが可能です。いつものように、manページを読んでください。
カロロスによる元の回答
Sshでリモートサーバーにログインし、sftpを使用してボックスに接続してから、get -r
コマンドを使用して、ディレクトリをリモートサーバーに転送します。 getコマンドを使用すると、ディレクトリをすでに作成していなくても、ディレクトリを再帰的に転送できます。
ssh remote ip
sftp local ip
get -r whichever-dir
SFTPケース:
その構造を私のftpにコピーする必要がありました。
mainfolder --- folder --- subfolder
| |
file1.txt file2.txt
それは私の問題を解決しました:
cd ./mainfolder
mkdir folder
put -r /from/source/folder/* /mainfolder/folder/
cd ./folder
mkdir subfolder
put -r /from/source/folder/subfolder/* /mainfolder/folder/subfolder/
Arch Linux Wiki から、sshfsを使用してsftp-shareをマウントすることが可能であることを知りました。 chrootとjailを備えたsftp-server を実行しており、sshfsは非常にうまく機能します。
sshfs <sftpuser>@<server>:<read/writable/directory> <your/local/mount/directory>
fusermount -u <your/local/mount/directory>