Linuxで大量のファイルをディレクトリ構造を維持したままコピーしたい


`source_dir` 配下にある `*.x` というファイル（同じディレクトリ階層には `*.y`
とか違う拡張子のファイルがあるがそれらを除いて）を、ディレクトリ構造を維持したまま `destnation_dir` にコピーするには、

[code]

    cd source_dir/
    cp --parent */*/*.x   destnation_dir/
    
[/code]

のようにすると実現できます。

しかしながら、`*.x` がたくさんあるとコマンドラインサイズオーバーでエラーになってしまいます。そのような場合、どうするのがいいのでしょうか？

例えば、

[code]

    cd source_dir/
    find . -name "*.x" | xargs tar cf - | tar xf - -C destnation_dir/
    
[/code]

のようにしてもできるようですが。




特定条件のファイルを相対パスを維持してコピーをしたい場合、`find`(1) でコピー対象のファイル名を抽出して `cpio`(1)
でアーカイブ化、`cpio`(1) で展開するのがよいです。

例:

[code]

    $ (
        cd /path/to/src/dir && find . -type f -name '*.x' -print0 |cpio -o0
      ) \
      |(
        cd /path/to/dst/dir && cpio -id
      )
    
[/code]

