如何在awk中使用stat命令



我想在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的代码中,因此它成为了一个代码注入漏洞。例如,如果$9x;reboot(完全有效的文件名),则命令行变为stat -c %Y x;reboot,并将运行reboot命令。

现在,请注意GNUls可以自己输出unix时间。

ls -l --time-style=+%s

或者,您也可以使用GNUfind来获得可靠的可解析内容:

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; }'

否则,您会遇到"打开的文件太多"。

相关内容

  • 没有找到相关文章

最新更新