如何让Gawk与find找到的文件配合,传递-printf输出为变量
解决find+awk传递文件信息的问题
原命令的问题分析
-printf "%p,%s"会直接将内容输出到标准输出,这就是你看到的额外输出-execdir gawk -v str="$7" ...里的$7是shell的位置参数,和find的输出完全无关,导致str变量没有有效数据
方案1:单awk进程处理(最优性能与内存占用)
这个方案仅启动find和awk两个进程,避免频繁创建子进程,同时通过管道传递文件信息,不会对外泄露-printf的内容:
LC_ALL=en_US.utf8 find "/d/ir" -name "file*.txt" -type f -printf "%p:%s\n" | awk -F: '{ # 拆分find传递的文件路径和大小 filepath = $1 filesize = $2 # 逐行读取目标文件内容 while ((getline line < filepath) > 0) { print line ";" filepath "," filesize } # 关闭文件句柄,避免内存泄漏 close(filepath) }'
关键说明:
find的-printf "%p:%s\n"将每个文件的完整路径和大小用冒号分隔输出到管道,不会直接打印到终端- awk通过
-F:指定分隔符,拆分出路径和大小 - 使用
getline逐行读取文件内容,处理完立即关闭文件,保证内存占用可控 - 最终输出完全符合需求格式,例如
A;/d/ir/file1.txt,4
方案2:find+exec+awk(适合单独处理每个文件的场景)
如果需要为每个文件单独启动awk进程,可以通过shell中转传递文件信息:
LC_ALL=en_US.utf8 find "/d/ir" -name "file*.txt" -type f -exec sh -c ' for file do # 用stat获取文件大小,避免find的printf输出到终端 filesize=$(stat -c "%s" "$file") gawk -v str="$file,$filesize" "{print \$0 \";\" str}" "$file" done ' sh {} +
关键说明:
- 使用
-exec ... +批量传递文件,减少子进程创建次数,优化性能 - 通过
stat获取文件大小,避免直接使用find -printf导致的额外输出 - 将文件路径和大小组合成
str变量传给awk,确保awk可以直接使用
内容的提问来源于stack exchange,提问作者lyrically wicked
相关产品推荐
相关产品推荐

