非 NTFS 的日誌式文件系統上,比如Ext4,能實現類似 Everything 這個軟體的利用日誌進行快速搜索的功能么?

Everything 是個 Windows 下的快速搜索文件的工具,按文件名搜索超快。但只支持 NTFS 格式文件系統,原理是利用了 NTFS 的 USN 日誌。 我想問問其它的日誌式文件系統,比如 Ext4,有沒有可能實現類似的這樣按文件名快速搜索。


NTFS的USN Journal 和 通常的Journaling Filesystem的Journaling的是兩回事,通常意義上的Journaling是用來保證文件完整的,在文件被真正寫到磁碟上之前是被放進journal里,文件寫完之後這個記錄就被刪掉(標記為完成)了,如果系統down掉,重啟後在journal里的記錄又沒有被Mark的就會重來一遍,這樣就保證了文件操作的完整性,無論是EXT4 XFS 還是NTFS都這個機制的。而USN Journal 則是NTFS的一個特殊機制——NTFS每一次的變動都被記錄下來,記入到一個文件, 也就是NTFS除了傳統的Journaling動作,還有個特殊動作就是USN journal。至於EXT4 之類的文件系統是沒有這個動作的。

USN journal 是用來監測整個文件系統(所有文件)的,你說的Everything只要監測查找那個特殊的日誌文件就可以了,速度自然很快。有人提到了 Inotify 這個監測機制 , 但是這個監測機制只能監測一個目錄,而且不能監測整個文件系統。 另外2.6.36里併入kernel的fanotify機制,看似更好其實也差不多,之前說好的 subtree監測也沒見個動靜。 所以無論是Inotfy還是fanotify都無法實現USN Journal的帶來的特性,因為這兩者都是VFS層實現,EXT4 也自然沒有這個功能。


日誌文件系統一般是指對文件塊的操作有日誌保存,一般是指元數據而非文件索引本身。說NTFS是日誌文件系統也主要是指NTFS能保證元數據正確性,而USN本身跟日誌文件系統關係不大。ext是日誌文件系統,是元數據的日誌。

我個人覺得掃描USN的過程本身就很費時,自建索引未必會慢多少。

主流文件系統都支持B+樹索引,所以如果一個文件夾只是文件太多,其實用系統的原生API未必就慢。自建索引慢的原因可能是文件夾本身太多,因為open一個文件夾的系統開銷還是不小的。

所以,結論就是,要在ext4上,只能自建索引。


謝邀,可惜我知道的並不多……

先馬克,我來看看我能 Bing 到什麼。

已知的快速搜索實現是基於額外索引的 locate,當然還有 Windows 搜索和 Spotlight……基於日誌的主要就是 Everything

(以下結果是可 Bing 的,手機不支持富文本所以也不敢出鏈接)

有一款數據恢復軟體,號稱可讀日誌,在 ufsexplorer 網站

Symantec 中的一篇 Ext4 Data recovery :How to recover lost files from ext4 file system in Linux 提到了以下內容:

&>………when a file is written it is noted in the journal. (雖然說本來是在說丟日誌造成的 bug 貌似,沒細讀)

其他的內容暫時沒有仔細閱讀,但是至少在 ext4 上這是初步可能的。也許我應該看看有啥讓日誌可讀一點的傢伙……

順便一提,好多文件系統都能關日誌,這樣玩不一定結果準確。


Everything在NTFS上的做法類似於直接把磁碟上的數據結構搞出來遍歷一遍,當然這用的還是windows提供的一些奇怪的API。我相信Ext4肯定有他自己的辦法。每個文件系統寫一次跑不了。


Google Desktop 就是跑在 Ext4 上的。


你看看你要找的是不是這個,https://forum.suse.org.cn/viewtopic.php?f=22t=471

主頁應該是這個 redhatlinux10/quickquest · GitHub


locale命令可實現部分功能,但他只能查到上次關機後已經存在的文件。另外有一個notification的機制,可實時感知文件的狀態變化。兩者結合,應該可以達到everything的效果


ext4的日誌應該是塊級別的吧,沒記錄相應的文件信息。linux下搜索locate已經很快了。


mlocate

ntfs ext通吃


不知道最新版everything能否實現?

但對於fat32格式的U盤等離線搜索已能實現。

方法:

1.主界面/工具/文件列表編輯器

2.編輯/添加目錄

文件/保存/確定

3.主界面/工具/選項/索引/文件列表 (添加上一步保存的.efu文件)/確定

4.搜索界面/右鍵/文件列表名


locate,whereis都是從日誌找文件的,locate file 如果file是文件夾名的話,也會把文件夾下的子文件絕對路徑列出,whereis找到的倒都是文件名。

這兩個命令速度和find比一下,感受非常明顯,find各種燒硬碟

弄錯了…前兩個命令是通過Linux的文件資料庫找文件的,不是通過日誌找文件的


推薦閱讀:

為什麼 GLIBC 的代碼量這麼大?

TAG:Linux | 文件系統 | Everything軟體 |