任何人都可以帮助编写 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
如果文件不存在则创建一个新文件或清空现有文件。