フォルダ構造を維持しながら特定のファイル形式をコピーする

フォルダ構造を維持しながら特定のファイル形式をコピーする

フォルダ全体に* .csvファイルが散在するフォルダ構造があります。これで、フォルダ構造を維持しながら、すべての* .csvファイルを別のターゲットにコピーしたいと思います。

仕組みは次のとおりです。

cp --parents *.csv /target
cp --parents */*.csv" /target
cp --parents */*/*.csv /target
cp --parents */*/*/*.csv /target
...

など。しかし、コマンドを使用したいと思います。

答え1

find非常に便利なオプションがあります-exec

find . -name '*.csv' -exec cp --parents \{\} /target \;

答え2

rsyncこの目的にも使用できます。

$ rsync -a --prune-empty-dirs --include '*/' --include '*.csv' --exclude '*' source/ target/

ソースツリーで空のディレクトリを維持するには、この--prune-empty-dirsオプションをスキップしてください。

$ rsync -a --include '*/' --include '*.csv' --exclude '*' source/ target/

そうすればいいえシンボリックリンク、変更日、ファイル権限、所有者などを保持するには;-)-aに置き換えます。-rlptgoD

答え3

あなたはそれを使用することができます探すそしてCPIOパススルーモードで

find . -name '*.csv' | cpio -pdm  /target

その後、現在のディレクトリとその下のディレクトリからすべての.csvファイルを見つけて/targetにコピーし、.csvルートディレクトリ構造を維持します.

使用する場合

find /path/to/files -name '*.csv' | cpio -pdm /target

そして下のすべてのファイルを見つけて下/path/to/filesにコピーします。/target/path/to/files

答え4

これは私にとって効果的です。

find -name "*.csv" | xargs cp --parents -t /target

ファイル名にスペースが含まれている場合は、オプションを追加し、説明のいずれかで提案されている-print0とおり-0に実行します。

find -name "*.csv" -print0 | xargs -0 cp --parents -t /target

関連情報