Performance

確定文件是否為 SQLite 數據庫的快速方法

  • March 9, 2018

我正在尋找一種方法來確定包含數千個文件的文件夾中的文件類型。文件名不透露太多,也沒有副檔名,但類型不同。具體來說,我試圖確定一個文件是否是一個 sqlite 數據庫。

使用file命令時,每秒判斷2-3個文件的類型。這似乎是解決問題的好方法,只是它太慢了。

然後我嘗試用 sqlite3 打開每個文件並檢查是否出現錯誤。這樣,我每秒可以檢查 4-5 個文件。好多了,但我認為可能有更好的方法來做到這一點。

每秒測試 2-3 個文件file對我來說似乎很慢。file實際上執行了許多不同的測試來嘗試確定文件類型。由於您正在尋找一種特定類型的文件(sqlite),並且您不關心辨識所有其他文件,因此您可以對已知的 sqlite 文件進行試驗以確定哪個測試實際辨識它。然後,您可以使用該-e標誌排除其他人,並針對您的完整文件集執行。請參閱手冊頁

-e, --exclude testname
        Exclude the test named in testname from the list of tests made to
        determine the file type. Valid test names are:

        apptype
           EMX application type (only on EMX).
        text
           Various types of text files (this test will try to guess the
           text encoding, irrespective of the setting of the ‘encoding’
           option).
        encoding
           Different text encodings for soft magic tests.
        tokens
           Looks for known tokens inside text files.
        cdf
           Prints details of Compound Document Files.
        compress
           Checks for, and looks inside, compressed files.
        elf
           Prints ELF file details.
        soft
           Consults magic files.
        tar
           Examines tar files.

*編輯:*我自己嘗試了一些測試。概括:

  1. 使用正確的標誌應用我的建議可以加快file大約 15% 的速度,以便測試確定 sqlite。這是什麼,但不是我預期的巨大改進。
  2. 你的文件測試真的很慢。在你做 2-3 的時候,我在標準機器上做了 500 個。您是在慢速硬體上,還是在檢查巨大的文件,在執行舊版本的file,或者…?
  3. 您必須保留“軟”測試才能成功將文件辨識為 sqlite。

對於一個 16MB 的 sqlite DB 文件,我做了:

#!/bin/bash
for  i in {1..1000}
do
   file sqllite_file.db | tail > out
done

命令行計時:

~/tmp$ time ./test_file_times.sh; cat out

real    0m2.424s
user    0m0.040s
sys 0m0.288s
sqllite_file.db: SQLite 3.x database

嘗試不同的測試排除,並假設確定是基於單個測試,它是辨識文件的“軟”(即魔術文件查找)測試。因此,我修改了file命令以排除所有其他測試:

file -e apptype -e ascii -e encoding -e tokens -e cdf -e compress -e elf -e tar sqllite_file.db | tail > out

執行 1000 次:

~/tmp$ time ./test_file_times.sh; cat out

real    0m2.119s
user    0m0.060s
sys         0m0.280s
sqllite_file.db: SQLite 3.x database

引用自:https://unix.stackexchange.com/questions/48812