たくさんの* .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 \;
あなたのツールを知っています。 ;-)
これには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
の別の組み合わせに置き換えてください。 ;-)
cp
コマンドは、複数のソース引数を許可します。
_cp **/*.csv --parents ../target
_
CAVEAT:ここでは再帰グロブを使用しています。これは、Bash 4+およびglobstar
のksh
オプションであり、zsh
ではデフォルトでサポートされています。再帰グロブは隠しファイルやフォルダーに一致しません、そして 一部の実装はシンボリックリンクに従いますが、他の実装はそうではありません 。
シェルが再帰的なグロブをサポートしていない場合、またはそれらを使用したくない場合は、次の操作を実行できます。
*.csv */*.csv */*/*.csv */*/*/*.csv
_-これはもちろん非常に冗長であり、ディレクトリ構造の深さを知る必要があります。$(find . -name '*.csv')
-これは隠しファイルとフォルダーに一致します。 find
は、シンボリックリンクをたどるかどうかの指定もサポートしており、便利な場合があります。これは私のために働きました:
find -name "*.csv" | xargs cp --parents -t /target
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/
この構造を./source
から./destination
に複製する場合を想定します。
cd source
find . -name "*.csv" | xargs tar cvf - | (cd ../destination ; tar xfp -)
これを1行としてカウントする準備ができています。cd source
はシェルの組み込みです。