2014-02-16 79 views
0

我想在awk中使用stat命令来实现列出文件的修改时间(秒)。我希望将stat中的输出信息保存在一个变量中,并在awk中进一步处理。如何格式化命令以实现此目标?如何在awk中使用stat命令

ls -la | awk '{ system("a=$(stat -c %Y $9)"); (further operation on a...) }' 

在此先感谢

多米尼克

回答

4

bash没有stat命令。 bash是一个shell,一个应用程序,其主要目标是运行其他命令并使它们一起交互。

stat是几个不同应用程序的名称,它们的语法不同,主要目标是成为系统调用的接口,即获取和输出文件的元数据信息。

你似乎指的那个似乎是GNU statzsh是我的知识中唯一具有内建 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,因此它变成了代码注入漏洞。例如,如果$9x;reboot(完全有效的文件名),则命令行将变为stat -c %Y x;reboot,并且该命令将运行reboot命令。

现在请注意,GNU ls可以输出unix时间本身。

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

或者你也可以使用GNUfind得到的东西是可靠地解析的:使用/作为分隔符

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)。

+0

在我看来,你应该以我预期的方式成为回答我问题的人。非常感谢你。 – Dominik

2
awk '{ "stat -c %Y " $9 | getline a; stuff_with_a; }' 
1

如果您不需要awk中,你总是可以使用

find $(pwd) -exec stat \{} --printf="%y\n" \; 
0

小除了说了些什么。 当具有大量文件:

awk '{ fh="stat -c %Y " $9; fh | getline a; close(fh); stuff_with_a; }' 

否则,你点击“打开的文件太多”。