web-dev-qa-db-ja.com

フォルダー構造を維持したまま特定のファイルタイプをコピーする

たくさんの* .csvファイルがフォルダ全体に散らばっているフォルダ構造があります。次に、すべての* .csvファイルをフォルダ構造を維持したまま別の場所にコピーします。

それは次のようにして機能します:

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

など、1つのコマンドを使用して実行したいと思います。

127
Mojo

Findの使用に抵抗する理由はありますか-exec?とても便利です。

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

あなたのツールを知っています。 ;-)

145
msb

これにはrsyncを使用することもできます。

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

ソースツリーの空のディレクトリを保持する場合は、--Prune-empty-dirsオプションをスキップします。

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

notでシンボリックリンク、変更日、ファイル権限、所有者などを保持したい場合は、-a-rlptgoDの別の組み合わせに置き換えてください。 ;-)

51
Dubu

パススルーモードで find および cpio を使用できます

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

これにより、現在のディレクトリ以下のすべての.csvファイルが見つかり、.をルートとするディレクトリ構造を維持しながら、それらを/ targetにコピーします。

使用する場合

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

/path/to/files以下のすべてのファイルを検索し、/target/path/to/files以下にコピーします。

36
user591

cpコマンドは、複数のソース引数を許可します。

_cp **/*.csv --parents ../target
_

CAVEAT:ここでは再帰グロブを使用しています。これは、Bash 4+およびglobstarkshオプションであり、zshではデフォルトでサポートされています。再帰グロブは隠しファイルやフォルダーに一致しません、そして 一部の実装はシンボリックリンクに従いますが、他の実装はそうではありません

シェルが再帰的なグロブをサポートしていない場合、またはそれらを使用したくない場合は、次の操作を実行できます。

  • _*.csv */*.csv */*/*.csv */*/*/*.csv_-これはもちろん非常に冗長であり、ディレクトリ構造の深さを知る必要があります。
  • $(find . -name '*.csv')-これは隠しファイルとフォルダーに一致しますfindは、シンボリックリンクをたどるかどうかの指定もサポートしており、便利な場合があります。
25
Kyle Strand

これは私のために働きました:

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

17
marko

rsyncのマンページから:

-R、-相対

相対パスを使用します。これは、ファイル名の最後の部分だけではなく、コマンドラインで指定されたフルパス名がサーバーに送信されることを意味します。これは、複数の異なるディレクトリを同時に送信する場合に特に便利です。たとえば、次のコマンドを使用した場合:

rsync -av /foo/bar/baz.c remote:/tmp/

...これにより、リモートマシンの/ tmp /にbaz.cという名前のファイルが作成されます。代わりに使用した場合

rsync -avR /foo/bar/baz.c remote:/tmp/

次に、/ tmp/foo/bar/baz.cという名前のファイルがリモートマシンに作成され、フルパスが保持されます。これらの追加のパス要素は、「暗黙のディレクトリ」と呼ばれます(つまり、上記の例では「foo」および「foo/bar」ディレクトリ)。

したがって、これも機能します:

rsync -armR --include="*/" --include="*.csv" --exclude="*" /full/path/to/source/file(s) destination/
11
Geremia

この構造を./sourceから./destinationに複製する場合を想定します。

cd source
find . -name "*.csv" | xargs tar cvf - | (cd ../destination ; tar xfp -)

これを1行としてカウントする準備ができています。cd sourceはシェルの組み込みです。

8
MadHatter