2012-05-10 112 views
3

問題:

有什麼方法可以跟蹤Linux中文件的進度(即新文件/保存文件)嗎?在Linux中觀察文件的更改

詳情:

我知道inotify可用於跟蹤文件的創建,刪除和修改整個文件夾。但是,這些水平非常低。文本編輯器通常在保存文件時,將修改後的緩衝區寫入臨時位置,然後移動它並覆蓋原始文件。當我想要的是MODIFY時,這會被看作是CREATEMOVE

對我來說,每次保存文件都會被解釋爲一個新文件,這看起來並不直觀。是否有任何文件的識別值可用於區分創建新文件和保存現有文件?提出這個問題的另一種方法是:「程序如BeagleSpotlight,Windows SearchGoogle Desktop如何解決此問題」?

目標:

這裏是描述我想有什麼好辦法:使用Vim,如果我打開一個文件並保存(:w),該文件將被寫入到一個臨時文件,然後移動到原始文件,欺騙inotify認爲創建了一個全新的文件,然後用它來覆蓋原始文件。但是,如果將文件添加到subversion(svn),然後使用Vim打開該文件並將其保存(:w),則svn將知道保存的文件實際上是修改後的文件,而不是新文件。 svn如何知道這一點?

回答

2

我會嘗試解釋新的或保存在Linux中可能看起來相同。 linux與windows的一個重大區別在於,沒有文件創建時間與inode一起存儲,只存儲訪問,修改(文件內容更改)和更改(inode更改)時間。因此,除非您將其他信息(如文件本身內的信息)保存爲元數據,否則無法確定該文件是剛創建還是隻是更改。

+0

即使存儲了創建時間,在這種情況下它是否仍然會被文本編輯器覆蓋?如果文本編輯器保存的文件如'cp a.txt a.txt〜; rm a.txt; cp a.txt〜a.txt'?有什麼辦法可以解決這個問題嗎? – puk

+0

我的問題不是我不知道什麼時候創建了文件,而是像'vim'這樣的程序寫入臨時文件,然後將其移至原始文件,因此無法確定文件何時被覆蓋完全或只是隨意修改。 – puk

+0

真實的臨時文件很難說清楚。你關心安全還是別的什麼?如果安全,那麼像tripwire這樣的程序可能會有所幫助,但我不知道他們如何確定文件何時更改。 – johnshen64

1

johnshen64回答了你爲什麼你沒有看到它被修改。關於SVN(或Git),他們會將文件識別爲已修改,因爲它們保留已管理文件的「密鑰」。

因此對於你的數據庫,你需要做同樣的事情。例如,你可以使用來自文件名(或文件名本身,但字符串比較較慢)的簡單數字哈希,並快速查詢以查看在添加文件之前他的文件是否已經管理。

+0

你在描述什麼,檢查一個文件是否已經存在於我的數據庫中,並不能解決我的問題:區分刪除/覆蓋文件和通過創建交換文件和覆蓋原始文件間接編輯現有文件用它。 – puk

+0

因此,您需要對具有相同文件名和更新文件的新文件(使用臨時文件進行更新)進行區分。我沒有從你的問題中得到答案。您可能需要查看可附加到ext *文件系統中文件的可能元數據,這些元數據應在編輯時通過臨時交換進行復制。或者像SELinux這樣的安全系統無法工作! – Huygens

+0

是的!另外,是的,元數據正是我正在尋找的內容,但我不知道從哪裏開始(甚至有可能嗎?)您的最後一句話「或像SELinux這樣的安全系統無法工作」有點含糊。請你澄清一下。 – puk

相關問題