ディレクトリ構造を維持しながら、ファイル拡張子によってファイルを再帰的にコピーするにはどうすればよいですか?


71

Linuxコマンドラインで、.txt1つのディレクトリ(およびそのサブディレクトリ)から(非常に大きな)ファイルのセットを別のディレクトリにコピーしたいと思います。

ディレクトリ構造をそのままにしておく必要があり、末尾がのファイル以外は無視する必要があります.txt


2
質問にcpとfindがタグとして含まれている場合、これらのオプションに縛られているということですか?データセットは非常に大きいため、何らかの理由でコピープロセスが中断され、再起動する必要があると想定するのは理にかなっています。find / cpアプローチが転送を再開し、欠落している部分のみをコピーできるかどうかはわかりません。find / cpに縛られていない場合は、rsyncの方が賢明です。--excludeオプションを使用すると、.txtファイルをスキップできます。
vtest

公平な呼び出し-rsyncがおそらくより良いオプションです。find / cpに関連付けられていません。( -それは、ライブウェブサーバーたrsyncは、リモートマシン上にインストールされていない、と私はできるだけ足跡のような小さいままにしたかった私はとにかくそれらを使用)
unclaimedbaggage

回答:


95

findcpioを使用してこれを行うことができます

cd /top/level/to/copy
find . -name '*.txt' | cpio -pdm /path/to/destdir

(-updm for overwrite destination content.)

なぜm ファイルの変更日を保持するだけだと思いました。
ムバシャール

7
cd /source/path
find -type f -name \*.txt -exec install -D {} /dest/path/{} \;

.後がありませんfind。また、MacOSの10.13.1で、これは働いていた:find . -type f -name "*.txt" -exec install -v {} /dest/path/{} \;
厳しい

2

別のアプローチ

find . -name '*.txt' -exec rsync -R {} path/to/dext \;


私はこの解決策が好きです。以前find . -iname '*.txt' -exec rsync -Rptgon {} path/to/dext \;は大文字と小文字を区別しない一致を行い、所有者とアクセス許可を保持していました。
MountainX

1

私のために働いた最も簡単な方法:

cp --parents -R jobs/**/*.xml ./backup/

1つの問題は、「親パス」が正しいように、「目的の」ディレクトリに移動する必要があることです。

また、bashで再帰的なグロブを有効にしたことを確認してください。

shopt -s globstar

1

最初にコピーしてみてはどうですか

cp -r /old/folder /new/folder

次に、新しいフォルダーに移動して実行します

find . -type f ! -iname "*.txt" -delete

あるいは単に

cp -r /old/folder /new/folder && find . -type f ! -iname "*.txt" -delete

編集:OK、フィルターするコマンドが1つ必要です(システムにcpioコマンドがないため、これをテストしていません!)。ここで見つけました:http : //www.gnu.org/software/findutils/manual/html_mono/find.html#Copying-A-Subset-of-Files

find . -name "*.txt" -print0 |
     cpio -pmd0 /dest-dir

私はまだ試していないので、これを最初にテストしてください。誰かが検証するなら、それは素晴らしいことです。


うなずく -これは動作しますが、.txtにフィルタリングしないと、数百万のファイル(数百GBで出力される)を見ています。必要であれば私がしなければならないかもしれないが、私は、可能な場合はコピー中にフィルタリングしてみたい
unclaimedbaggage

1
私は「0」-pmd0から削除する場合乾杯は、編集されたバージョンでは動作します
unclaimedbaggage

そのままに0して、コマンドの最後(の直前)に-pmd0追加する必要があります。-print0find|
Gマン14

1

macOSでも同じことをしようとしていましたが、どのオプションも実際に機能しませんでした。私が発見するまでditto

多くの.wavファイルをコピーし、ビデオファイルをスキップしなければなりませんでした。そこで、私が思いついたのは次のとおりです。

find . -type f -iname "*.wav" -ls -exec ditto {} /destination/folder/{} \;

  • find .-現在のフォルダーで検索を実行します。cd /source/folder開始する前に確認してください

  • -type f -ファイルのみを検索するように指定します

  • -iname "*.wav" -これは、大文字と小文字を区別しない* .wavを探すように指示します
  • -ls-これにより、作業中のファイルが表示されます。それ以外の場合は何も表示されません。
  • -exec ditto {} /destination/folder/{} \; -同じディレクトリツリーでファイルをコピーおよび作成するすべての作業を行います。

0

ディレクトリに移動します:

find . -regex '<regexp_to_get_directories_and_files_you_want>' | xargs -i cp -r --parents {} path/to/destination

正規表現を管理する場合は、少し簡単で強力です。


-1

ディレクトリに移動します:

cp '*.css' /path/to/destination

ディレクトリ内の各フォルダーに移動する必要がありますが、これはこれまで見てきたほとんどのオプションよりも優れています。


この方法は...大規模なディレクトリのためにあなたはかなりしばらくの間、これを行うことができることを意味し、再帰的ではありません
イアン・リード
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.