フォルダ構造を維持したまま特定のファイルタイプをコピーします
On 2月 10, 2021 by adminフォルダ全体に多数の* .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 \;
コメント
- おそらくこのため\ {\} \;
-
'{}'
も同様に機能します -
-execdir
は-exec
よりも安全です。単に一方を他方に置き換えるだけでは、意図したとおりにフォルダ構造が保持されません。 - なぜコマンドでコピーしようとすると、'ディレクトリ'が削除されますか?
- 理由を説明してください。中括弧はここでエスケープする必要がありますか?
回答
rsync
forこれ。
$ rsync -a --prune-empty-dirs --include "*/" --include "*.csv" --exclude "*" source/ target/
ソースツリーから空のディレクトリを保持する場合は、--prune-empty-dirs
オプションをスキップします。
$ rsync -a --include "*/" --include "*.csv" --exclude "*" source/ target/
シンボリックリンク、変更日、ファイルのアクセス許可、所有者などを保持したくない場合は、iv id = “を置き換えてください b2997df2c0 “>
と-rlptgoD
の別の組み合わせ。 😉
コメント
回答
find . -name "*.csv" | cpio -pdm /target
これにより、すべての.csvファイルが検索されます現在のディレクトリ以下で、.
をルートとするディレクトリ構造を維持しながら/ targetにコピーします。
使用する場合
find /path/to/files -name "*.csv" | cpio -pdm /target
/path/to/files
以下にあるすべてのファイルを検索し、それらを/target/path/to/files
以下にコピーします。 。
コメント
- これまでのすべての回答をトップダウンで試しましたが、最初の試みで機能したのはこれだけでした
- これは受け入れられた答えであるはずです。
- GNUドキュメントが役に立ちました: "コピーパスモードでは、[
-p
オプションで要求されたcpio]は、標準入力からコピーするファイルのリストを読み取ります。それらをコピーするディレクトリは、オプション以外の引数として指定されます。" … " -d必要に応じて先頭のディレクトリを作成します。" … " -m以前のファイル変更時間を保持しますファイルを作成するとき。"
回答
cp
コマンドは複数のソース引数を許可します:
cp **/*.csv --parents ../target
警告:ここでは再帰的なグロブを使用しています。これはBash4 +およびivid = “のglobstar
オプションです。 b3bedba95c “>
であり、zsh
でデフォルトでサポートされています。再帰グロブはは非表示のファイルとフォルダーに一致し、一部の実装はシンボリックリンクに従いますが、他の実装は従いません。
シェルが従わない場合 ” t supp ort再帰グロブ、またはそれらを使用したくない場合は、次の操作を実行できます。
-
*.csv */*.csv */*/*.csv */*/*/*.csv
-これはもちろん非常に重要です冗長であり、ディレクトリ構造の深さを知る必要があります。 -
$(find . -name "*.csv")
-このはは隠しファイルと隠しフォルダに一致します。find
は、シンボリックリンクをたどるかどうかの指定もサポートしています。これは便利な場合があります。
コメント
- これはまさに私が試したもの(再帰グロブ)であり、すべてではありませんがいくつかが見つかりましたか?かなり奇妙です。 npm copyfilesスクリプトを使用してもまったく同じ結果が得られましたが、findコマンドを使用すると、すべてが検索されます…
- @Randyaa 'いくつか必要です正確には、'が見つからなかったファイルの詳細。再帰的グロブの正確な動作についてのディスカッションここと続きここが役立ちます。 。
- 何らかの理由で再帰グロブが有効になっていないことが判明しました'。'これまでにこれに遭遇したことはありませんが、コマンドの直前に
shopt -s globstar
を実行するだけで修正し、すべて問題ありません。フォローアップしてくれてありがとう! -
--parents
が私が探していたものでした。ありがとう
回答
これは私のために働いた:
find -name "*.csv" | xargs cp --parents -t /target
コメント
- 最も単純な構文でのベストアンサー。正常に動作し、覚えやすいです。多くの場合、
find [things] | xargs [do stuff]
は非常に強力です。 - 同意しました。他のいくつかの回答と比較して非常に簡単です。
- ファイル名にスペースがある場合の区切り
- @MichelePiccoliniファイル名のスペースは
find -print0
およびxargs -0
。
回答
のマンページ:
-R、-relative
相対パスを使用します。これは、コマンドラインで指定されたフルパス名がファイル名の最後の部分だけでなくサーバーに送信されることを意味します。これは、複数の異なるディレクトリを同時に送信する場合に特に便利です。このコマンド:
rsync -av /foo/bar/baz.c remote:/tmp/
…これにより、リモートマシンの/ tmp /にbaz.cという名前のファイルが作成されます。代わりに使用した場合
rsync -avR /foo/bar/baz.c remote:/tmp/
次に、/ tmp / foo / bar / baz.cという名前のファイルがリモートマシンに作成され、フルパスが保持されます。これらの追加のパス要素は「」と呼ばれます。暗黙的edディレクトリ」(つまり、上記の例の「foo」および「foo / bar」ディレクトリ)。
したがって、これも機能します。
rsync -armR --include="*/" --include="*.csv" --exclude="*" /full/path/to/source/file(s) destination/
コメント
- この回答を提供していただきありがとうございます。 BSDユーザーランド(macOS)、スペースを含むおよびパスと互換性があります。
回答
この構造を./source
から./destination
に複製する場合:
cd source find . -name "*.csv" | xargs tar cvf - | (cd ../destination ; tar xfp -)
これを1行として数える準備ができています。cd source
はシェル組み込みです。
コメント
-
tar
には-C
オプションがあり、最初にディレクトリを変更する必要がありません。
-m
は--prune-emty-dirs
。-R
オプションを追加して、ソースの親ディレクトリ構造をコピーすることもできます。 (ここで私の答えを参照してください。)