如何遍历文件夹及子文件夹,用AWK筛选符合条件的TXT文件?
问题解决:遍历查找首行含指定模式的TXT文件
错误原因
你遇到的find: missing argument to -exec错误,是因为find的-exec参数有两个必填规则:
- 必须用
{}指代找到的文件 - 必须用
\;(或';')或+标记命令结束
原脚本缺少这两个关键部分,导致find无法识别-exec的完整命令。
正确实现方法
方法1:补全-exec的标准格式
#!/bin/bash find . -name '*.TXT' -exec awk 'NR == 1 && $0 ~ /CYCLE[_ ]+DATE/ { print FILENAME }' {} \;
{}:代表find找到的每一个.TXT文件\;:告诉find当前-exec命令结束,每个文件会单独启动一次awk处理
方法2:批量处理(效率更高)
如果要处理的文件数量较多,推荐用+替代\;,它会把所有找到的文件一次性传给awk,减少进程启动次数:
#!/bin/bash find . -name '*.TXT' -exec awk 'NR == 1 && $0 ~ /CYCLE[_ ]+DATE/ { print FILENAME }' {} +
方法3:结合xargs处理
也可以用管道搭配xargs实现,适合需要额外处理文件名的场景(比如文件名含空格时,要加-print0和-0):
#!/bin/bash # 普通场景 find . -name '*.TXT' | xargs awk 'NR == 1 && $0 ~ /CYCLE[_ ]+DATE/ { print FILENAME }' # 文件名含空格的兼容写法 find . -name '*.TXT' -print0 | xargs -0 awk 'NR == 1 && $0 ~ /CYCLE[_ ]+DATE/ { print FILENAME }'
核心逻辑说明
find . -name '*.TXT':递归遍历当前目录及所有子目录,筛选出后缀为.TXT的文件awk命令部分:NR == 1:只处理文件的第一行/CYCLE[_ ]+DATE/:匹配CYCLE与DATE之间包含一个或多个空格或下划线的行print FILENAME:符合条件时打印当前文件的完整路径
内容的提问来源于stack exchange,提问作者Roger Costello
相关产品推荐
相关产品推荐

