2014-02-16 72 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; }' 

否則,你點擊「打開的文件太多」。