我想在awk中使用stat命令来实现列出文件的修改时间(秒)。我希望将stat中的输出信息保存在一个变量中,并在awk中进一步处理。如何格式化命令以实现此目标?如何在awk中使用stat命令
ls -la | awk '{ system("a=$(stat -c %Y $9)"); (further operation on a...) }'
在此先感谢
多米尼克
我想在awk中使用stat命令来实现列出文件的修改时间(秒)。我希望将stat中的输出信息保存在一个变量中,并在awk中进一步处理。如何格式化命令以实现此目标?如何在awk中使用stat命令
ls -la | awk '{ system("a=$(stat -c %Y $9)"); (further operation on a...) }'
在此先感谢
多米尼克
bash
没有stat
命令。 bash
是一个shell,一个应用程序,其主要目标是运行其他命令并使它们一起交互。
stat
是几个不同应用程序的名称,它们的语法不同,主要目标是成为系统调用的接口,即获取和输出文件的元数据信息。
你似乎指的那个似乎是GNU stat
。 zsh
是我的知识中唯一具有内建 stat命令(使用不同语法)的shell。
awk
是另一个应用程序,是awk
语言的解释器,其主要目标是进行文本处理。 awk
语言具有system()函数,该函数用于运行shell(sh
,而不是bash
)命令行。
有了:
awk '{system("a=$(stat -c %Y $9)")}'
awk
启动一个新的进程,执行sh
解释。该外壳将其自己的变量设置为stat
的输出,然后退出。所以,这没有用。你想要的是设置一个awk
变量。
你会做到这一点与awk
的相当于在shell命令托换的($(...)
):
awk '{"stat -c %Y " $9 | getline a; ...}'
然而,在那里,awk
的第9场最终被扩大并包含在传递到代码解释stat...
命令行的shell,因此它变成了代码注入漏洞。例如,如果$9
是x;reboot
(完全有效的文件名),则命令行将变为stat -c %Y x;reboot
,并且该命令将运行reboot
命令。
现在请注意,GNU ls
可以输出unix时间本身。
ls -l --time-style=+%s
或者你也可以使用GNU
find
得到的东西是可靠地解析的:使用/
作为分隔符
find . ! -name . -prune -printf '%Ts/%s/%p\0' |
while IFS=/ read -d '' -r mtime size name; do
something with "$mtime" "$size" "$name"
done
(在这里,因为它是保证不会在年底发现的唯一字符输出的路径为find
)
find
也可以得到亚秒粒度(%[email protected]
而不是0123)。
awk '{ "stat -c %Y " $9 | getline a; stuff_with_a; }'
如果您不需要awk中,你总是可以使用
find $(pwd) -exec stat \{} --printf="%y\n" \;
小除了说了些什么。 当具有大量文件:
awk '{ fh="stat -c %Y " $9; fh | getline a; close(fh); stuff_with_a; }'
否则,你点击“打开的文件太多”。
在我看来,你应该以我预期的方式成为回答我问题的人。非常感谢你。 – Dominik