查找包含字符串的文件并将该文件的全部内容附加到新文件中

查找包含字符串的文件并将该文件的全部内容附加到新文件中

任何人都可以帮助编写 bash shell 脚本来满足以下要求吗?创建一个名为“file.txt”的新文件,然后搜索包含第一行以“Format”开头的文件,并将该文件的全部内容放入新文件“file.txt”中。必须对当前目录中的所有文件执行此操作,以便在新文件中生成附加结果。

答案1

find . -maxdepth 1 -type f \
        -exec awk 'NR == 1 && /^Format/ { exit 0 } { exit 1 }' {} \; \
        -exec cat {} \; > /tmp/file.txt

这将找到当前目录中的所有常规文件,并awk依次对每个文件执行脚本。删除-maxdepth 1递归搜索的参数。

awk如果当前文件的第一行开头包含单词“Format”,则脚本将以零退出状态退出。如果没有,则退出,退出状态为 1。

如果awk脚本以零退出状态退出,则该find命令将继续调用cat该文件,该文件将简单地将其内容输出到标准输出。

findto的重定向/tmp/file.txt将确保最终输出的所有文件都cat转到/tmp/file.txt.在find命令开始执行之前,该文件将被 shell 截断(清空) 。

您不希望file.txt在当前目录中创建该文件,因为这可能会使find命令进入无限循环。


这里使用的参数find就像测试关于发现的事情find。如果测试成功,则执行下一个测试。如果一项测试失败,find则继续寻找其他测试。

  • -maxdepth 1如果找到一个目录,如果进入该目录,find该目录将超过目录深度 1,则测试失败。find因此,它只会保留在最顶层的目录级别。

  • -type f对于任何非常规文件(即目录、套接字、设备文件等),都会失败。

  • -exec如果执行的命令返回非零退出状态,则测试将失败。

答案2

循环grep结果:

truncate -s 0 file.txt

for match in $(grep -lr "$STRING" --exclude file.txt .); do
    cat "$match" >> file.txt
done

truncate如果文件不存在则创建一个新文件或清空现有文件。

相关内容