![查找包含字符串的文件并将该文件的全部内容附加到新文件中](https://linux22.com/image/116207/%E6%9F%A5%E6%89%BE%E5%8C%85%E5%90%AB%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E6%96%87%E4%BB%B6%E5%B9%B6%E5%B0%86%E8%AF%A5%E6%96%87%E4%BB%B6%E7%9A%84%E5%85%A8%E9%83%A8%E5%86%85%E5%AE%B9%E9%99%84%E5%8A%A0%E5%88%B0%E6%96%B0%E6%96%87%E4%BB%B6%E4%B8%AD.png)
任何人都可以帮助编写 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
该文件,该文件将简单地将其内容输出到标准输出。
find
to的重定向/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
如果文件不存在则创建一个新文件或清空现有文件。