首先大量介绍的是:
if (system ("test -r " $1) != 0) {
...
}
这个方法最简洁明了,但是有一个问题是当在一个awk脚本里面要检查文件很多,比如几千个,那么性能就是一个很大的问题。
网上google了一下,有介绍用@load "filefuncs"
的,听起来很方便很好用,但是我捣鼓了半天也没有成功,放弃了。
最后找到一个折中办法,性能反正凑合用:
function file_exist(filename, sz) {
command="stat -c%s "filename" 2>/dev/null";
command | getline sz;
close(command);
return length(sz)
}
BEGIN{
if (file_exist("a-existed-file")) {
print "Yes";
} else {
print "No";
}
if (file_exist("a-non-existed-file")) {
print "Yes";
} else {
print "No";
}
if (file_exist("a-empty-existed-file")) {
print "Yes";
} else {
print "No";
}
}
运行结果是:
$ awk -f test.awk
Yes
No
Yes
来补充一下@load "filefuncs"
失败的原因:可能是之前的gawk版本过低,导致各种错误,自从升级到4.2.1之后就成功了,脚本例子如下:
@load "filefuncs"
BEGIN {
if (stat("filename", _st) >= 0) {
printf "Error: file(%s) exists\n", <filename>
} else {
printf "Error: file(%s) does not exist\n", <filename>
}
}
这个版本和脚本在Linux和Windows下均测试过。
网友评论