findを使用して見つかったファイルの内容を単一のファイルにマージするにはどうすればよいですか?

findを使用して見つかったファイルの内容を単一のファイルにマージするにはどうすればよいですか?

私は貴重なデータを含むパーティションを再フォーマットして、病気の場所(非常にひどく)を自分で撮影することができました。もちろん意図したものではありませんでしたが、そのようなことが起こりました。

しかし、ほとんどのデータを使用しtestdiskて回復しました。photorecこれで、すべてのデータがほぼ25,000のディレクトリに分散されています。ほとんどのファイルは.txtファイルで、残りは画像ファイルです。各ディレクトリには300以上の.txtファイルがあります。

grep.txtファイルから特定の文字列を抽出し、.txtを使用してfindファイルに出力できます。たとえば、次の行を使用して、データが回復されたファイルにあることを確認します。

find ./recup*/ -name '*.txt' -print | xargs grep -i "searchPattern"

「searchPattern」をファイルに出力できますが、これはパターンのみを提供するだけです。これが私が本当に達成したいものです:

すべてのファイルに移動し、特定の文字列を探します。ファイルで文字列が見つかった場合は、ファイルの内容全体を出力ファイルに変換します。パターンが複数のファイルで見つかると、後続のファイルの内容がこの出力ファイルに追加されます。私が探しているパターンを出力するのではなく、パターンが見つかったファイルの内容全体を出力したいことに注意してください。

私はこれが可能だと思いますが、ファイル内の特定のパターンを特定した後、ファイルのすべての内容を取得する方法がわかりません。

ベストアンサー1

あなたの目標を正しく理解すれば、次のようなものを得ることができます。

find ./recup*/ -name '*.txt' -exec grep -qi "searchPattern" {} \; -exec cat {} \; > outputfile.txt

*.txtその後、すべてのファイルを探し./recup*/、各ファイルをテストしsearchPattern、一致する場合はそのcatファイルを探します。すべてのedファイルの出力catoutputfile.txt

各パターンと出力ファイルに対してこれを繰り返します。


一致するディレクトリが多い場合は、./recup*1つのディレクトリで終わることができますargument list too long error。この問題を解決する簡単な方法は、次のことです。

find ./ -mindepth 2 -path './recup*.txt' -exec grep -qi "searchPattern" {} \; -exec cat {} \; > outputfile.txt

これはフルパスと一致します。だから./recup01234/foo/bar.txt一致します。したがって-mindepth 2、一致しません./recup.txt。または./recup0.txt

おすすめ記事