web-dev-qa-db-ja.com

コマンドラインからHTTPSを介してWebDAVサーバーにディレクトリを再帰的にアップロードするにはどうすればよいですか?

私はかなり単純な状況に直面しています。ファイルの大きなツリーをそのまま、HTTPS経由で到達可能な WebDAV サーバーにアップロードする必要があります。コマンドラインのみでLinuxボックスからアップロードを開始する必要があります。ボックスにプログラムをインストールできます。

私は試しました Cadaver ですが、再帰的なディレクトリのアップロードはサポートしていません。

それを実現するための簡単なツール/スクリプトを知っていますか?


わかりました、私はそれをした何かを見つけました。

ここにあるdavpush.plスクリプトから始めました https://github.com/ptillemans/davpush

いくつかの変更が必要でした:

  • すべての「dav://」を「https://」に置き換えます
  • print POUT "open";」の前に「print POUT $script;」を追加します

くそー、失礼なディレクトリを単にアップロードするためにPerlスクリプトをハックする必要があります。私はまだ簡単なツール/スクリプトを探しています。

12
eskatos

gnomevfs-copyを試してください:

編集:gvfs-copyは再帰的ではありません。私はそれにパッチを当てましたが、それでもコードを公開するのは大変です。それまでの間、perldavの dave を確認してください。再帰的な転送を行います。

Fuseを無効にしていない場合は、試してみてください davfs2

独自のツールをコーディングすることに不利でない場合は、gvfsを使用して、 gvfs-copyのソースコード からインスピレーションを得ることができます。

同様の問題が発生しているため、より良い解決策が見つかるかもしれません

2
user36520

これは、 cadaver を使用してthaを実行できるようにする、すばやくハッキングされたシェルスクリプトです。

#!/bin/sh

usage () { echo "$0 <src> <cadaver-args>*" >/dev/stderr; }
error () { echo "$1" >/dev/stderr; usage; exit 1; }

test $# '<' 3 || \
    error "Source and cadaver arguments expected!";

src="$1"; shift;
test -r "$src" || \
    error "Source argument should be a readable file or directory!";

cd "$(dirname "$src")";
src="$(basename "$src")";
root="$(pwd)";
rc="$(mktemp)";
{
    find "$src" '(' -type d -a -readable ')' \
    -printf 'mkcol "%p"\n';
    find "$src" '(' -type f -a -readable ')' \
    -printf 'cd "%h"\nlcd "%h"\n'            \
    -printf 'mput "%f"\n'                    \
    -printf 'cd -\nlcd "'"$root"'"\n';
    echo "quit";
} > "$rc";

cadaver -r "$rc" "$@";
rm -f "$rc";

davcpy.shという名前の場合、次のようなコマンド

davcpy.sh "<local-directories>/<dirname>" "https://<target-website>/<some-directories>/"

からの再帰コピーを許可します

<local-directories>/<dirname>

名前の付いたリモートのものに

<some-directories>/<dirname>

cadaverのスクリプト機能を使用して、ログイン/パスワードのインタラクティブな入力を引き続き許可することに注意してください。スペースを含む奇妙なファイル名やディレクトリ名を処理するのにも十分堅牢だと思いますが、そのようなケースはテストしていません。

8
nberth

解決策は Rclone である可能性があります。これは、rsyncに似た、WebDAVをサポートする一方向のコマンドライン同期プログラムです(とりわけ)。宛先に存在するファイルをスキップして、ディレクトリを再帰的にコピーできます。同期動作を制御するためのコマンドラインオプションがいくつかあります。たとえば、ターゲットファイルがソースから削除された場合に削除するかどうかなどです。多くのディストリビューションで利用できるパッケージがありますが、プレーンバイナリをインストールして実行することもできます。初めて、「リモート」を定義する必要があります。

rclone config create my-remote webdav \
    url https://my-webdav-server/my-dir/ \
    vendor other \
    user 'onno'  pass 'mypasswd'

その後、ファイルやディレクトリをコピーまたは同期できます。

rclone copy /home/onno/mydir my-remote:
2
Onnonymous

OSXで機能するnberthの回答の変更:

#!/bin/sh

usage () { echo "$0 <src> <cadaver-args>*" >/dev/stderr; }
error () { echo "$1" >/dev/stderr; usage; exit 1; }

test $# '<' 3 || \
    error "Source and cadaver arguments expected!";

src="$1"; shift;
test -r "$src" || \
    error "Source argument should be a readable file or directory!";

cd "$(dirname "$src")";
src="$(basename "$src")";
root="$(pwd)";
rc="$(mktemp -t davcopy)";

{
    find "$src" -type d | xargs -I{} echo 'mkcol '{}
    find "$src" -type f \
    -exec echo 'cd '$(basename {}) \; \
    -exec echo 'lcd '$(basename {}) \; \
    -exec echo 'mput '{} \; \
    -exec echo 'cd -' \; \
    -exec echo 'lcd '"$root" \;
    echo "quit";
} > "$rc";

cadaver -r "$rc" "$@";
rm -f "$rc";

使い方は同じです。 nberthの答えからの引用:

[上記]の名前がdavcpy.shの場合、次のようなコマンド

davcpy.sh "<local-directories>/<dirname>" "https://<target-website>/<some-directories>/"

からの再帰コピーを許可します

<local-directories>/<dirname>

名前の付いたリモートのものに

<some-directories>/<dirname>
1
JayQuerie.com

私はUbuntu Linuxを使用しています。 Fuse、(ユーザースペースのファイルシステム)、およびmountdavfs(davfs2)を利用して、Webdavサーバー上のサブディレクトリをローカルフォルダーとしてマウントできます。

ターミナルを開き、次の手順に従います。

  • Davfs2が存在しない場合はインストールします:_Sudo apt-get install davfs2_

  • Webdavサーバーに接続します。

    _Sudo mount.davfs -o user=knb,rw https://webdav.site.de/data /mnt/somedir_

(ファイルシステムの所有者を入力する必要があります。入力しないと、書き込み権限がありません)

さらに、これらの行を_/etc/dafs2/davfs2.conf_に入力する必要がありました。

_use_proxy       0         
use_locks       0
if_match_bug    1
_

https://bugs.launchpad.net/ubuntu/+source/davfs2/+bug/46696 を参照してください

mount-コマンド-結果(出力の最終行):

https://webdav.mysite.de/icdp on /media/somedir type Fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=0,allow_other,max_read=16384,uid=1000,gid=0,helper=davfs)

また、再起動後も存続する永続的なマウントには、奇妙なファイル_~/.davfs2/secrets_が必要かどうかを確認してください。

これで、_cp -vr /data/myphotos /media/somedir_のようなコマンドを発行でき、ファイルは再帰的にコピーされ、webdavサイトにアップロードされます。

0
knb