awk判断文件是否存在

2023-02-22  本文已影响0人  CodingCode

首先大量介绍的是:

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下均测试过。

上一篇下一篇

猜你喜欢

热点阅读