2015-06-20 96 views
2

我正在處理一個進程,需要在對指定目錄中的任何文件進行任何更改時重新進行遞歸。如何在目錄中找到最新修改文件的時間戳(遞歸)?

我想避免使用任何重物,如inotify。我不需要知道哪些文件已更新,而只需要瞭解是否更新了文件。此外,我不需要通知每一個變化,而只需要知道在特定時間間隔內是否發生了任何變化,這是由過程動態決定的。

必須有辦法用一個相當簡單的bash命令來做到這一點。我不介意多次執行命令;性能不是我對這個用例的主要關注。但是,命令的速度越快越好。

我唯一需要的輸出是最後改變的時間戳,這樣我就可以把它比作我已存儲在內存中的時間戳。

我也開到更好的解決方案。

+0

_upon任何改變,任何_文件 - >我還需要了解新的文件。刪除的文件將是獎金,但不是必需的。跟蹤這些可能也很困難。做目錄的校驗和會起作用,但可能會很慢。 –

回答

1

我只是想一個更好的解決方案比the previous one ,這也讓我知道被刪除的文件。

的想法是使用校驗,但不是所有文件的校驗;相反,我們只能對時間戳進行校驗。如果有任何更改(新文件,刪除文件,修改文件),那麼校驗和也會改變!

find . -type f -printf '%[email protected],' | cksum

  1. '%[email protected],'返回每個文件作爲Unix時間戳的修改時間,所有在同一行上。
  2. cksum計算時間戳的校驗和。
  3. ?????
  4. 利潤!

它實際上甚至更快比以前的溶液(〜20%),因爲我們不需要排序(這是最慢的操作之一)。即使是校驗和也會更快,特別是對於如此少量的數據(每個時間戳22個字節),而不是對每個文件執行校驗和。

+1

替代校驗和:'md5sum',或SHA系列之一('shasum','sha1sum','sha512sum'等)。 'cksum'在安全性不是問題的情況下很好(這不是我的用例),否則應該使用'sha512sum'。 –

2

我居然找到一個很好的答案,從another closely related question

我只修改了命令一點,以使其適應我的需求:

find . -type f -printf '%[email protected]\n' | sort -n | tail -1

  1. %[email protected]返回修改時間爲UNIX時間戳,這正是我需要的。
  2. sort -n數字排序的時間戳。
  3. tail -1僅保存最後/最高時間戳。

這還算跑得快;我的整個家目錄〜400ms,預期目錄~30ms(使用time [command]測量)。

+0

〜400ms在131,766個文件上,〜30ms在9387個文件上。所以,每1000個文件〜3ms。 –

+0

使用['find。 -type f | wc -l'](http://superuser.com/questions/198817/recursively-count-all-the-files-in-a-directory) –

-1

$找到./ -name「* .sqlite」 -ls 在這裏你可以使用這個命令來獲取信息爲您的文件。使用過濾器,以獲得時間戳

+0

我需要跟蹤_任何更改爲任何file_;我沒有我想用'-name'跟蹤的特定文件。我也需要知道新文件。 –

+0

ohh抱歉沒有正確讀取它,但這更簡單,因爲您只需要grep特定目錄中的文件的時間戳並比較那裏的時間戳。你可以編寫一個簡單的shell腳本來完成下面的步驟,可以滿足你的任務1. grep時間戳來自目錄中的所有文件2.將它放在一個數組中,並將它比較得到最新的時間戳並獲得相應的目錄 – user3156262

+0

我不需要所有文件的時間戳,但只有最新的一個。 _「我需要的唯一輸出是最後一次更改的時間戳,因此我可以將其與我已經存儲在內存中的時間戳進行比較。」_我發現接受的答案更容易實現該目標。 –

相關問題