ディレクトリの内容を非再帰的にコピーするrsync


8

一連のディレクトリの内容を別のリモートシステムに非再帰的にコピーしようとしています。

/dirA/dir1/file
/dirA/dir2/file
/dirA/dir3/file

dir1、dir2、およびdir3には、コピーしたくないディレクトリが多数含まれています。同じディレクトリ構造を維持しながら、リモートホストを/ dirBにコピーします。

私は試した:

rsync /dirA/*/ host:/dirB/
rsync /dirA/   host:/dirB/

しかし、彼らは私が望むことをしません。

回答:


20

rsyncでは、ファイルとディレクトリの包含または除外をトリガーするパターンを指定できます。次のようなものを使用したいと思います。

rsync -a -f '- /*/*/' /dirA/ host:/dirB/

説明:

  • -aによると、「シンボリックリンク、デバイス、属性、許可、所有権など」の再帰と保存の両方をアクティブにするアーカイブモードをトリガーしますman rsync
  • -f--filter=、ファイルフィルタリングルールを追加するの略です。
    • パターンは単一引用符で囲まれているため、シェルはワイルドカードを展開しません。この場合、二重引用符も同様に機能します。
    • - これは除外パターンであることを意味します。
    • 先頭/は、パターンがdirA/(rsync "transfer-root")から開始する必要があることを意味します。
    • */*パターンの一部は、サブディレクトリ内のすべてを参照します。
    • 末尾/は、除外をディレクトリに制限します。のサブディレクトリ内のファイルdirA/は影響を受けません。

そのため、最終的にrsyncは1レベル下にしかコピーしません(また、第2レベルのディレクトリも作成しません)。


2
非常に素晴らしい!-f '- /*/'トップレベルのファイルのみに制限するために使用できました。また-f '- .*'、ホームディレクトリを同期しているため、ドットファイルを除外するように指定する必要がありました。
ハリズフ14

5

上記のソリューション(PleaseStandによる)は、何らかの理由で機能しませんでした。これはしかし働いた:

rsync -avc --no-r ./source/* ./destination/

これに代わるものもあります:

rsync -avc --exclude "/" ./source/ ./destination/


1

rsyncの「機能」の1つは、ディレクトリの解析方法です。

rsync /dirA/ host:/dirB/rsync /dirA host:/dirB 理論的には同等 である 必要があります。

再帰を奨励するために望んでいないとして、あなたは避けたい-r-a他のものに加えて暗示います-r

私はまだ研究を完了していませんが、これが私の最初の答えです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.