假设我有以下文件和目录结构:
$ tree
.
├── a
├── b
└── dir
└── c
1 directory, 3 files
也就是两个文件a
and b
与目录一起dir
,其中另一个文件c
stands.
我想处理所有文件awk
(GNU Awk 4.1.1
,确切地说),所以我做了这样的事情:
$ gawk '{print FILENAME; nextfile}' * */*
a
b
awk: cmd. line:1: warning: command line argument `dir' is a directory: skipped
dir/c
一切都很好,但是*
也扩展到目录dir
and awk
尝试处理它。
所以我想知道:是否有任何本地方式awk
可以检查给定元素是否是文件,如果是,则跳过它?也就是说,不使用system()
for it.
我通过调用外部使其工作system
in 起始文件:
$ gawk 'BEGINFILE{print FILENAME; if (system(" [ ! -d " FILENAME " ]")) {print FILENAME, "is a dir, skipping"; nextfile}} ENDFILE{print FILENAME, FNR}' * */*
a
a 10
a.wk
a.wk 3
b
b 10
dir
dir is a dir, skipping
dir/c
dir/c 10
Note also the fact that if (system(" [ ! -d " FILENAME " ]")) {print FILENAME, "is a dir, skipping"; nextfile}
works counter intuitively: it should return 1 when true, but it returns the exit code.
我读到A.5 gawk 中的扩展 POSIX awk 中没有的扩展:
- 命令行上的目录会产生警告并被跳过(请参阅命令行目录)
然后链接页面显示:
4.11 命令行上的目录
根据 POSIX 标准,在 awk 命令行上命名的文件
必须是文本文件;如果不是,那就是致命错误。大多数版本
awk 将命令行上的目录视为致命错误。
默认情况下,gawk 会针对命令中的目录生成警告
线,但否则忽略它。这使得使用 shell 更加容易
awk 程序中的通配符:
$ gawk -f whizprog.awk * Directories could kill this program
如果给出了 --posix 或 --traditional 选项,则 gawk
恢复为将命令行上的目录视为致命错误。
See 扩展示例 Readdir,一种将目录视为可用的方法
来自 awk 程序的数据。
事实上,情况确实如此:与之前相同的命令--posix
fails:
$ gawk --posix 'BEGINFILE{print FILENAME; if (system(" [ ! -d " FILENAME " ]")) {print FILENAME, "is a dir, skipping"; nextfile}} ENDFILE{print FILENAME, NR}' * */*
gawk: cmd. line:1: fatal: cannot open file `dir' for reading (Is a directory)
我检查了16.7.6 Reading Directories
上面链接的部分,他们谈论readdir
:
readdir 扩展添加了目录的输入解析器。用途
如下:
@加载“读目录”
但我既不知道如何调用它,也不知道如何从命令行使用它。