私のディレクトリ構造は次のとおりです。
/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
あなたがそれを持っていて無料ならfind
、xargs
あなたはこれをすることができます:
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
、-0
in 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-from
nullで区切られたパス名のリストとして解釈します。 「標準入力ストリームからの読み取り」、つまりコマンドからの読み取りを意味するには、-
withを使用します。ファイルごとにできるだけ多くのメタデータをコピー/同期するには()オプションを使用し、読み取りパス名のディレクトリパス部分を削除するには()オプションを使用します。--files-from
find
--archive
-a
--no-relative
--no-R
読み取るパス名はルートディレクトリに相対的であるため、ソースディレクトリが使用さrsync
れます。/
find
パイプラインは一度実行され、間のパス名をrsync
安全に渡します。すでにリストされているファイルと同じ名前の別のファイルを無視すると、名前の競合を解決できることに注意してください。find
rsync
rsync
usersync
から直接呼び出すこともできますが、効率を上げるためにuseを使用してディレクトリを見つけて、各ディレクトリのすべてのファイル同期を呼び出すことができます。find
-exec
find
rsync
*.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
。