我想在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