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
隠された名前と一致するようにシェルオプションを設定する必要があります。