rsyncを使用してすべての特定のファイルをフォルダにコピーします。コマンドを見つける必要はありません。

rsyncを使用してすべての特定のファイルをフォルダにコピーします。コマンドを見つける必要はありません。

rsyncの例はたくさんありますが、私の質問は次のとおりです。特定のファイル形式(.mp3など)をフォルダにコピーできるrsync専用のコマンドラインはありますか? findコマンドを使わずに!そして!まったく! destフォルダにディレクトリ構造を再作成しますか? (これにより巨大なディレクトリが生成されたとしても?)

答え1

rsyncディレクトリ階層から単一の汎用ディレクトリにファイルを繰り返しコピーすることはできません。これが最も簡単な方法ですfind。以下を使用してください。

find source-dir -name '*.mp3' -type f -exec cp {} dest-dir/ \;

上記のコードは、source-dir名前が終わる通常のファイルを見つけて.mp3コピーしますdest-dir(名前の競合を処理しません)。

GNUツールを使用すると、効率を高め、cp呼び出し回数を最小限に抑えることができます。

find source-dir -name '*.mp3' -type f -exec cp -t dest-dir/ {} +

もちろん、rsync代わりに電話をするのを妨げることはありません。cp

find source-dir -name '*.mp3' -type f -exec rsync -a {} dest-dir/ \;

またはより効果的に、

find source-dir -name '*.mp3' -type f -exec sh -c 'rsync -a "$@" dest-dir/' sh {} +

数千未満のファイルがあることを保証でき、**ファイル名のグロービングパターンをサポートするシェルがある場合(shopt -s globstar図を参照bash)。

rsync -a --no-r source-dir/**/*.mp3 dest-dir/

ただし、これによりパス名と一致するファイル形式を解決できなくなり、隠された名前ではなく名前のみが一致します。zshシェルでは、source-dir/**/*.mp3(.D)(隠されている可能性がある)通常のファイルのみを選択できます。シェルでは、bash一致するパス名を繰り返し、testを使用して各パス名をテストする必要があります-f。また、dotglob隠された名前と一致するようにシェルオプションを設定する必要があります。

関連情報