2016-07-06 7 views
1

各ディレクトリに1つのファイル(index.html)だけの多数のディレクトリがあります。 grepを使用してファイル内のパターンを探し、そのディレクトリとともにファイルを別のディレクトリにコピーしたいと考えています。grepファイル(文字列用)と別のディレクトリへのコピーディレクトリ

ファイルのコピーの例を見ましたが、ファイルを含むディレクトリを別のディレクトリにコピーしたいと考えています。

ので、長いリスト ...次は

grep -rl "string" source_dir 


d1/index.htmk 
d2/index.html 
d3/index.html 

... を使用してディレクトリとファイルのマッチングのリストであると言います。 DEST_DIRは、ディレクトリ構造を維持するパススルーモードでcpioを使用するには

. 
.. 
d1/index.html 
d2/index.html 
d3/index.html 
... 
... 

TIA

+0

'.htmk'は本当に' .html'であるはずの最初のコードブロックでタイプミスしたと仮定します。 –

答えて

2

のように見えるよう

は今DEST-dirのにコピーしたいと思います。 cpioは、tarとほぼ同じくらい古いもので、これまでより多くの利点がありましたが、obscurityに入っています。私はそれに新たなんだと主にこのコマンドを構築するために、古代のLinux Journal cpio guideを追っ:

mkdir dest_dir 
cd source_dir 
grep -Zlr "string" . |cpio -p0dmv ../dest_dir 

これは取るように設計されて直接cpioにパイプラインを介して、あなたの条件に一致するファイルのnull-terminated*リストを渡しますこの方法でファイルのリストを作成し、アーカイブまたはコピーします( "パススルー"、-p)。ディレクトリ構造(-d)と変更時刻(-m)を保持して、ここでは後者を行います。これを冗長(-v)に設定して、進行状況を見ることができます。 sshで接続している場合、ネットワーク上の各ファイル名をレンダリングすると処理が遅くなる可能性があります。 NULL終了について

*: 私は改行を含むファイル名の問題を回避するためにcpio -0grep -Zlを使用(!ことを行いません)。 grep -Zlには、ヌル文字(パスに無効な文字のみ)で区切られたすべての一致するファイルがリストされ、cpio -0にはNULL終了入力が必要です(xargs -0と同じ)。

 

私はもともと、新しい場所にそれを抽出するために、再び一時的なアーカイブとtarを作成するためにtarをお勧めします。これは、tarが別のファイル(または標準入力、cpioのように)内のそのファイルのリストを受け入れる能力を持たないので、ファイルリストを引数に変換するのにxargsを使用しましたが、xargsは長すぎるコマンドを複数の呼び出しに分割し、tar連結された出力**を抽出できません。

mkdir dest_dir 
cd source_dir 
grep -Zlr "string" . |xargs -0 tar -pc |tar -pxi --directory=../dest_dir 

これは、あなたの先のディレクトリを作成ソースディレクトリに入り、( * nullで終わるファイルリスト-Zlではgrepを実行し、-r(再帰的)。xargs -0は、そのリストをtarの引数に変換し、それをアーカイブします。別のtarインスタンスは、それらを宛先ディレクトリに抽出します。 --max-procs=1

**xargsデフォルトと一緒に連結された複数のtarball、その結果、一度に1つのプロセスを実行しなければなりません。 further readingは、その問題を解決するためにtarの抽出に-iignore zeros)を追加するという簡単な方法を提案していますが、tar形式でこれを処理できるはずです。上記のコードに追加しましたが、テストしていません。

+0

与えられた文字列に対して、それぞれ約1,80,000個のディレクトリを最大1つのhtmlファイルで置きます。だから私はこれが問題を起こさないことを願っています。 – rusticnomad

+0

1,80,000。 1つのファイルを持つディレクトリの総数は600万で、一度に1つずつ実行される30個の "文字列"に基づいて30個の奇数サブにソートされます。 – rusticnomad

+0

私はこのエラーを試してみました: xargs:tar:シグナルによって終了13 – rusticnomad

関連する問題