web-dev-qa-db-ja.com

ディレクトリ構造を維持したまま、ファイル拡張子でファイルを再帰的にコピーする方法を教えてください。

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

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

71

これを行うには、 find および cpio を使用します。

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

(-updm for overwrite destination content.)
94
Iain
cd /source/path
find -type f -name \*.txt -exec install -D {} /dest/path/{} \;
7
sborsky

他のアプローチ

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

2
Marc

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

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

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

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

shopt -s globstar
1
icyerasor

私は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/{} \; - 同じディレクトリツリーを持つファイルをコピーおよび作成するすべての作業を行います。
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

編集:あなたは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

最初にテストしてください。まだ試していません。誰かが検証すれば、それは素晴らしいことです。

1
Dennis Hodapp

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

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

正規表現を管理すれば、もう少し簡単で強力です。

0
keywalker