Rsyncは暗黙的に除外されたファイルを「検索」

Rsyncは暗黙的に除外されたファイルを「検索」

特定の種類と日付の簡単なファイル転送を実行するために、Linuxシステムのコマンドと組み合わせた反作用rsyncコマンドがあります。find

これはコマンドです:

rsync -avx --timeout=30 --ignore-existing admin@host:'`find /results/analysis/ -mtime -1 -type f -iname  "*.xq"`' /home/serverdir/

問題はこれである:

ファイルが見つかると、上記のコマンドは完全に実行されます。ファイルが見つからない場合は中断され、何らかの理由でリモートシステムのホームディレクトリにあるファイルを実際に送信します。ちなみに、これは-mtimeで示されている1日よりはるかに古いです。

エラーメッセージ:

receiving incremental file list
./
rsync: send_files failed to open "/home/admin/.viminfo": Permission denied (13)
file.txt

コマンドが何も報告しないようですfind。 rsyncはデフォルトでホームディレクトリのすべてを転送します。この問題を解決する方法についてのアイデアはありますか?

答え1

コピーしたいのはファイルだけなので、findを混ぜるのではなく直接行うことができます。変更に影響を与えずに安全にテストできるように、このフラグを含めました。準備ができたら、コマンドラインから削除してください。rsync*.xqrsync--dry-run

rsync --dry-run -av --include '**/' --include '*.xq' --exclude '*' admin@host:/results/analysis/ /home/serverdir/

--include合意の混合は、--exclude以下のように左から右に記述される。

  1. --include '**/'すべてのディレクトリを含む(ファイルを除く)
  2. --include '*.xq'globと一致するすべてのファイル(またはディレクトリ)を含みます。*.xq
  3. --exclude '*'記載されていない項目を除外

答え2

あなたが観察したのは、まさに何が起こっているのかです。HOST:明示的なパスなしでデフォルトのディレクトリ全体(通常はホームディレクトリ)をコピーするように求められます。

Note  also  that  host  and  module references don’t require a trailing
slash to copy the contents of the default directory.  For example, both
of these copy the remote directory’s contents into "/dest":

       rsync -av host: /dest
       rsync -av host::module /dest

可能であれば、完全に避けるかfind(rsyncは送信されたファイルに無視できる帯域幅を使用していることに注意してください)、2つのステップで実行することをお勧めします(まずfind、次のrsync出力で)。

より正確には、次の操作が機能します(簡潔にするためにいくつかのrsyncオプションを省略しました)。

ssh user@host find source-dir -mtime -1 -type f -printf %p\\\\0 \
| rsync --from0 --files-from=- user@host:. dest-dir/

あなたのコメントで述べた主な変更点は、findコマンドがローカルではなくリモートホストで実行されることです。

関連情報