我想在awk中使用stat命令来实现所列文件的修改时间(以秒为单位)。我想把stat的输出信息保存在一个变量中,并在awk中进行进一步的处理。如何格式化命令以实现此目标?
ls -la | awk '{ system("a=$(stat -c %Y $9)"); (further operation on a...) }'
提前感谢
多米尼克
bash
没有stat
命令。bash
是一个shell,一个主要目标是运行其他命令并使它们一起交互的应用程序。
stat
是几个不同应用程序的名称,具有不同的语法,其主要目标是成为stat(2)
系统调用的接口,即获取和输出有关文件的元数据信息。
你所指的似乎是GNUstat
。据我所知,zsh
是唯一一个具有内置stat命令(具有不同语法)的shell。
awk
是另一个应用程序,是awk
语言的解释器,其主要目标是进行文本处理。awk
语言有一个system()函数,用于运行shell(sh
,而不是bash
)命令行。
带有:
awk '{system("a=$(stat -c %Y $9)")}'
CCD_ 13开始执行CCD_ 14解释器的新进程。该shell将其自己的a变量设置为stat
的输出,然后退出。所以,这没用。您想要的是设置一个awk
变量。
您将使用awk
的shell命令子配置($(...)
):
awk '{"stat -c %Y " $9 | getline a; ...}'
然而,在那里,awk
的第9个字段最终被扩展并包含在传递给解释stat...
命令行的shell的代码中,因此它成为了一个代码注入漏洞。例如,如果$9
是x;reboot
(完全有效的文件名),则命令行变为stat -c %Y x;reboot
,并将运行reboot
命令。
现在,请注意GNUls
可以自己输出unix时间。
ls -l --time-style=+%s
或者,您也可以使用GNU
find
来获得可靠的可解析内容:
find . ! -name . -prune -printf '%Ts/%s/%p ' |
while IFS=/ read -d '' -r mtime size name; do
something with "$mtime" "$size" "$name"
done
(此处使用/
作为分隔符,因为它是唯一保证不会在find
输出的路径末尾找到的字符)
find
还将为您提供亚秒粒度,其中%T@
而不是%Ts
可用。
awk '{ "stat -c %Y " $9 | getline a; stuff_with_a; }'
如果你不需要awk,你可以一直使用
find $(pwd) -exec stat {} --printf="%yn" ;
对所说内容的小补充。当有大量文件时:
awk '{ fh="stat -c %Y " $9; fh | getline a; close(fh); stuff_with_a; }'
否则,您会遇到"打开的文件太多"。