Files

壓縮大型文件夾樹,同時保持導航和提取特定文件的簡單方法

  • December 31, 2019

我有一個大而重的文件夾樹,其中包含許多文件和文件夾。我想壓縮它以減少儲存大小。這棵樹將不再經常使用,但很可能我將來需要導航它並從中提取一兩個特定文件。

因此,我不希望有一個包含完整樹的巨大壓縮 tar 文件,因為這將使以後導航變得非常困難,我將不得不解壓縮所有內容以提取任何文件……對嗎?在我準備好 tar 文件之前,它也需要兩倍的空間,然後我可以刪除原始樹。

所以我想使用 bz2 或 xz 之類的東西並分別壓縮每個文件。但是,如果我在一個子文件夾中有許多類似的小文件,我想壓縮每個文件不如將所有文件聚合在一個 tar 文件中然後壓縮它……對嗎?(我假設如果有更多資訊要壓縮,壓縮器可以找到更多冗餘)。

因此,我該怎麼辦?

聚合文件以獲得最佳壓縮的想法與將它們分開以便以後輕鬆導航和提取資訊的想法相反。是否有工具或推薦的方法來選擇中間點?例如,我是否應該搜尋所有最終文件夾(樹的每個分支末尾的那些)並首先對其內容進行 tar 然後壓縮它們,然後繼續進行上述深度並進行迭代?

編輯:測試案例

我對單個文件的壓縮和所有文件的壓縮進行了xz比較7z。測試案例由 58000.66 M 的文件夾樹組成,其中 1250397 個文件被分類到 4290 個目錄中。壓縮所有內容後:

find . -type f -print0 | xargs -0 xz

我得到 14576.68 M。但是,如果我用 9622.74 M 壓縮整個樹7z,幾乎減少了 5 Gb。

…必須解壓縮所有內容才能提取任何文件…對嗎?

如果您避免使用焦油,則不會;搜尋文件名並從存檔中提取單個文件很容易(使用 .zip、.7z 可以快速)。例子;

> du -h a.*                     
223M    a                                        
115M    a.tar.gz                
75M     a.7z            

> 7z l a.7z | wc -l                     
2253  

> ( time 7z l a.7z >/dev/null ) 2>&1 | grep user                                            
user    0m0.014s

> ( time tar -ztf a.tar.gz >/dev/null ) 2>&1 | grep user
user    0m2.055s

…壓縮每個文件將不如聚合 tar 文件中的所有文件然後壓縮它…對嗎?

正確的。

我的第一條評論是 7z 是多執行緒和索引的,而 tar.xz 不是,因此存在巨大的性能差異。

但實際上我只會使用文件系統或設備映射器進行壓縮;

vdo create --name=vdo_volume --device=/dev/vda

壓縮的文件系統; https://en.m.wikipedia.org/wiki/Category:Compression_file_systems 例如

mount -t btrfs  -o compress=lzo /dev/sdb /media/my_compressed_files

請注意,這兩者都可以在環回設備上完成,因此它們可以像文件中的整個文件系統一樣工作。

還有像 fuse-7z-ng 這樣的存檔熔斷器驅動程序,它可以快速進行數據檢索,但它們的寫入性能將是可怕的。

fuse-7z-ng files.7z /media/my_compressed_files

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