ルートディレクトリとサブディレクトリでのみ特定のファイルを再同期します。

ルートディレクトリとサブディレクトリでのみ特定のファイルを再同期します。

私のディレクトリ構造は次のとおりです。

/books/a.epub
/books/sub/b.epub
/books/test/c.epub

みんな探したいルートディレクトリ(/books/)とサブディレクトリ(/books/)にある.epubファイル/)rsyncを使用して* .epubファイルのみをリモートディレクトリにコピーします。

これまで私は次のことを試しました。

rsync -av  --include='*.epub' --include='*/' --exclude='*' /media/share/Books/ /home/user/docker/calibre/books/

しかし、ディレクトリも同期しています。

出力は次のようになります。

/a.epub
/b.epub
/c.epub

答え1

あなたがそれを持っていて無料ならfindxargsあなたはこれをすることができます:

find . -type f -iname "*.epub" -print0 | xargs -0 -I {} rsync -aPEmivv "{}" "/destination/directory"

使用したくない場合xargs

find . -type f -iname "*.epub" -exec rsync -aPEmivv "{}" "/destination/directory" \;

(両方の亜種が/books/ディレクトリで実行されます)

ただし、-a必要なオプション(再帰、シンボリックリンク、辞書権限、保存時間、所有者の保持、グループの維持、デバイスファイルの維持)を決定します。rsync-rlptgoD

ファイル名を別のプログラムにパイプするときは、ファイル名の特殊文字によって問題が発生しないように、NULL区切り文字列を使用することをお勧めします(NULL区切り入力の場合は-print0スイッチin find-0in xargs、およびinを使用)。rsync

答え2

繰り返すレベルはいくつありますか?そうでなければ?

rsync -aP  books/*/*.epub books/*.epub /home/user/movedbooks/.

答え3

このrsyncユーティリティは、ファイルまたは入力ストリームからパス名を読み取ることができます。findを使ってコピーしたいファイルを見つけることができますrsync

/media/share/Books名前がシェルワイルドカードパターンと一致する通常のファイルをディレクトリから繰り返し検索するとします*.epub。これらの基準に一致する見つかったファイルは、/home/user/docker/calibre/booksソース階層で見つかった対応するディレクトリ構造を作成せずに単一のディレクトリにコピーする必要があります。

find /media/share/Books -type f -name '*.epub' -print0 |
rsync   --from0 --files-from=-  \
        --archive --no-relative \
        / /home/user/docker/calibre/books

上記の方法はfind非標準ですが、一般的に実装されている述語をサポート-print0しているとします。そうでない場合-print0に置き換えることができます-exec printf '%s\0' {} +

上記で使用したオプションを参照してくださいrsync。この--from0オプションは、rsync読み取りデータストリームを--files-fromnullで区切られたパス名のリストとして解釈します。 「標準入力ストリームからの読み取り」、つまりコマンドからの読み取りを意味するには、-withを使用します。ファイルごとにできるだけ多くのメタデータをコピー/同期するには()オプションを使用し、読み取りパス名のディレクトリパス部分を削除するには()オプションを使用します。--files-fromfind--archive-a--no-relative--no-R

読み取るパス名はルートディレクトリに相対的であるため、ソースディレクトリが使用さrsyncれます。/find

パイプラインは一度実行され、間のパス名をrsync安全に渡します。すでにリストされているファイルと同じ名前の別のファイルを無視すると、名前の競合を解決できることに注意してください。findrsyncrsync


usersyncから直接呼び出すこともできますが、効率を上げるためにuseを使用してディレクトリを見つけて、各ディレクトリのすべてのファイル同期を呼び出すことができます。find-execfindrsync*.epub

find /media/share/Books -type d -exec sh -c '
        for dirpath do
                rsync   --archive       \
                        --include="*.epub" --exclude="*"        \
                        "$dirpath/" /home/user/docker/calibre/books
        done' sh {} +

ここで実行する操作は、試した操作と似ていますが、処理ディレクトリを除いて再帰を明示的に許可しません。再帰を使用する代わりに、我々はrsyncこれをfind

関連情報