如何将使用 find 找到的文件内容转换为单个文件?

Ami*_*Ami 11 find shell-script

通过重新格式化保存有价值数据的分区,我设法在受伤的地方开枪(真的很糟糕)。当然,这不是故意的,但确实发生了。

但是,我设法使用testdiskphotorec恢复了大部分数据。所以现在我拥有分布在近 25,000 个目录中的所有数据。大多数文件是 .txt 文件,其余是图像文件。每个目录中有 300 多个 .txt 文件。

我可以grep或使用find从 .txt 文件中提取某些字符串并将它们输出到文件中。例如,这是我用来验证我的数据是否在恢复的文件中的一行:

find ./recup*/ -name '*.txt' -print | xargs grep -i "searchPattern"
Run Code Online (Sandbox Code Playgroud)

我可以将“searchPattern”输出到一个文件,但这只是给了我那个模式。这是我真正想要完成的:

浏览所有文件并查找特定字符串。如果在文件中找到该字符串,则将该文件的所有内容转换为输出文件。如果在多个文件中发现该模式,请将后续文件的内容附加到该输出文件中。请注意,我只是不想输出我正在搜索的模式,而是输出找到模式的文件的所有内容。

我认为这是可行的,但我只是不知道如何在从中获取特定模式后获取文件的所有内容。

phe*_*mer 10

如果我正确理解您的目标,以下将执行您想要的操作:

find ./recup*/ -name '*.txt' -exec grep -qi "searchPattern" {} \; -exec cat {} \; > outputfile.txt
Run Code Online (Sandbox Code Playgroud)

这将查找 中的所有*.txt文件./recup*/,对每个文件进行测试searchPattern,如果匹配,则为cat该文件。所有cated 文件的输出将被定向到outputfile.txt.

对每个模式和输出文件重复。


如果您有大量匹配的目录./recup*,您可能会以argument list too long error. 解决此问题的简单方法是执行以下操作:

find ./ -mindepth 2 -path './recup*.txt' -exec grep -qi "searchPattern" {} \; -exec cat {} \; > outputfile.txt
Run Code Online (Sandbox Code Playgroud)

这将匹配完整路径。所以./recup01234/foo/bar.txt会匹配。该-mindepth 2是如此,它会不匹配./recup.txt,或./recup0.txt

  • @Ami 如果您使用多个字符串,将所有正文件名保存到另一个文件(`grep -l`),然后从文件列表中保存`|sort|uniq` 和 `cat` 可能会更简单。 (2认同)