特定の種類と日付の簡単なファイル転送を実行するために、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
*.xq
rsync
--dry-run
rsync --dry-run -av --include '**/' --include '*.xq' --exclude '*' admin@host:/results/analysis/ /home/serverdir/
--include
合意の混合は、--exclude
以下のように左から右に記述される。
--include '**/'
すべてのディレクトリを含む(ファイルを除く)--include '*.xq'
globと一致するすべてのファイル(またはディレクトリ)を含みます。*.xq
--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
コマンドがローカルではなくリモートホストで実行されることです。