SFTP - 再帰的に新しいファイルを取得する


0

私はこのようなファイルシステムの削除構造を持っています:

+ /measure
    + / 2013-09
         + / 2013-09-04
              + / fooinstrument
                   + result03343445845.csv
                   + result03343445846.csv
              + / barinstrument
                   + result03343445847.csv
                   + result03343445848.csv

それは階層構造でたくさんのファイルを含みます。私は持っています 読み取り専用 これへのアクセス SFTP (利用可能なCIFSのような他のプロトコルやサーバ上で実行されている特別なソフトウェアはありません) (それで、ソースホストにソフトウェアをインストールすることはできません。)

私は毎晩cronジョブを使って自分のデータベースにこれらのファイルをインポートしたいのです(cronジョブ自体は問題ありません)。だから、私はしたい すべての新しいファイルを再帰的にダウンロードする 私のローカルファイルシステムにそれから私のアプリケーション(コマンドラインパラメータとしてそのファイル名)にダウンロードされた各ファイルのパスを渡します、例えば:

/usr/local/bin/myapp -import /srv/localstorage/result03343445845.csv

この呼び出し myapp 重要な点ではありません。ダウンローダの出力を何らかのファイルにパイプ処理することによって、ダウンロードしたすべてのパスのリストを取得できる場合は、後でファイルリストを1行ずつ読み込んでアプリを起動できます。それは問題ありません。

元のディレクトリ階層は気にしません。私の主な目的は、ファイルをローカルファイルシステムに移動して、コマンドラインツールでファイル名を入力として使用できるようにすることです。したがって、サーバーによって与えられた深い階層の複製を持っているかどうか、またはすべてのファイルが同じディレクトリーに入るかどうかは、それほど重要ではありません。ファイル名はユニークな連載なので、後者はさらに興味深いかもしれません。したがって、すべてのファイルを1つのディレクトリにまとめて移動しても問題ありません。

+ / localstorage
     + result03343445845.csv
     + result03343445846.csv
     + result03343445847.csv
     + result03343445848.csv

私の問題の1つは、ソースファイルがサーバー上に永遠に残るということです。私がこれらのデータを収集するのは私だけではないので、サーバーはすでにダウンロードした古いファイルを削除しません。そのため、スクリプトはどのファイルが古いかを「記憶」する必要があります(=>ダウンロードしないでください)。これまでに取得されたすべてのファイルのローカルコピーを保持することによって。 (2つのファイルが同じファイル名を持っている場合、ファイル名はシリアル番号で作られているので、それらは安全に等しいと見なすことができます。だから内容の比較は必要ありません。)

もう1つ重要なことは、1年後にはおそらく30.000ファイル以上になるでしょう。私がすでに持っている古いものも含めて、毎晩すべてのファイルをダウンロードするのは合理的ではありませんでした。したがって、新しいファイルをダウンロードするだけで十分です(new =ローカルコピーにそのようなファイル名はありません)。

これを行うための最も簡単で最良の方法は何ですか Linux(Debian) ?私は使用するシェルスクリプトを考えました sftpscp あるいは多分 curl?そのような脚本についてのあなたのアドバイスとあなたのアイデアをどうもありがとう!

//編集:ところで、あなたはどう思いますか?質問はServerfaultによく合いますか?

回答:


2

rysnc ディレクトリ階層を同期するための素晴らしいユーティリティです。理想的には rsync サーバーとクライアントの両方にインストールされますが、クライアントにのみインストールされていても機能します。これらのコマンドは、ローカルマシンにまだ存在していないファイルを転送して実行します。 myapp それらの上に。

cd DESTINATION_DIR
rsync -rv --ignore-existing --log-format='%o %f' USER@HOST:/PATH_TO_measure_DIR . | grep recv | sed "s,recv ,," | xargs -i sh -c "[ -f {} ] && /usr/local/bin/myapp -import {}"

rsync ファイルを持ってきて(ディレクトリ構造を保存して)それから受信したファイルのリストをパースし、それらが通常のファイルであることを確認します myapp 新しく作成されたディレクトリ上で) myapp それらの上に。


1

サーバーディレクトリをローカルにマウントします。

sshfs  username@servername:/path/ /mount

または

curlftpfs username@servername:/path/ /mount

それから

rsync -av /mount /data/ > /data/rsync.log

新しいファイルのみをコピーし、ログファイルにファイル名がある


sshfsの使用はお勧めしません。sftpを直接使用するよりもはるかに遅くなります。また、rsyncは自分自身でssh / sftpを介して接続することができるので、マウントする必要はありません。
wingedsubmariner
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.