web-dev-qa-db-ja.com

rsyncディレクトリ内のN個の最新ファイル

ディレクトリ内の最新のn個のファイルをリモートサーバーに同期する最も簡単な方法は何でしょうか。

6
Leda

最も簡単な方法は、bashの代わりにzshを実行することです。

_rsync -a -- /path/to/directory/*(om[1,42]) remote-server:
_

括弧内では、omはファイルを逆変更時間(つまり、年齢の増加)で並べ替え、_[1,42]_は最初の42件の一致を選択します。

ディレクトリではなく通常のファイルのみが必要な場合は、開き括弧の後に_._を追加します。その他の可能性については、 zshexpn man page の「globqualifiers」を参照してください。

ディレクトリ内だけでなく、_/path/to/directory_をルートとするディレクトリツリー内のファイルを照合する場合は、/path/to/directory/**/*(.om[1,42])を使用します。ただし、これにより、すべてのファイルがターゲット上の同じディレクトリに送信されます。

現在の作業ディレクトリからファイルを送信するとします。

rsync `ls -tp | grep -v / | head -n <n>` <destination> <options>

トリックを行います。例えば:

rsync `ls -tp | grep -v / | head -n 10` user@Host:/dest/dir/ --progress --compress

これにより、現在の作業ディレクトリにファイルが見つからない場合、または最上位のファイルのいずれかにスペースやその他の特殊文字が含まれている場合、エラーが発生します。

ls -tp | grep -v / | head -n <n>の前後の `文字は、bashにコマンドを実行するように指示し、スペースで区切られたリストとして結果のファイルリストに置き換えます。 -tオプションはlsにタイムスタンプでソートするように指示し、-pはディレクトリ名の後に/を追加するように指示し、grep部分は/で終わる行を選別して、ディレクトリを送信しないようにします。最新のファイルを変更時間ではなく作成時間で判断する場合は、-clsオプションに追加します(ただし、一部のプログラムでは、ファイルを更新する代わりに削除および置換するため、ctimeとmtimeを同じにすることができます)ファイルが長く存在しているように見えますが)。

私はそれが間違いなく最も簡単なの方法であるとは主張しませんが、それは私が最初に考える方法でしょう。


(mwmのコメント内のサブ質問)

逆はどうですか?サーバーからローカルへ?

ローカルファイルのようにrsyncコマンドラインに複数のリモートファイルソースを含めることはできないと思うので、これはもう少し複雑になります。サーバー上でrsyncを介してsshを実行し、ローカルのsshdに戻るトンネルを開くことができます(rsyncを実行するのと同じssh呼び出しで)接続を受信するには、基本的に反対側から同じコマンドを使用しました。

2
David Spillett

Zshオプションを機能させることができませんでしたが、これを作成することはできました。

ls -tr | head -n 10 | rsync --files-from=- user@Host:/dest/dir/

10を必要な最新のファイルの数に置き換えます。

重要:ここにある他のソリューションと同様に、rsyncはこれらのファイルを並べ替えて、必要な順序で送信します。通常は最も古いものから順に送信します:(。rsyncに最新のファイルを送信させるソリューションを探しています。最初に、優先順位を付けることができるときに、rsyncをもう少し掘り下げる必要があります。これは、rsyncコマンドで-vvを使用して確認できます。

0
Adrian Scott