Linux

將 Tar 拆分為獨立卷

  • April 6, 2019

我有一些包含超過 100Gb 數據的目錄。我正在嘗試將它們歸檔到較小的捲中,即每個 10Gb,它們是獨立的/獨立的。

問題是如果我使用tar+ split,它會導致多個不獨立的 tar 部分。我不能只從其中一個部分中提取文件,除非我先將所有部分組合成一個大文件。

我也嘗試過使用tar -c -L1000M ...拆分卷,但這也不起作用,並且存在長文件名被截斷的問題。

也試過star了,但似乎它的拆分卷也不是獨立的;而 7zip 在 unix 中不保留權限。

我希望擁有獨立拆分檔案的原因是出於安全目的,如果其中一個拆分文件損壞,我仍然可以從其他檔案中檢索數據。如果我只想提取特定的文件/文件夾,而不需要將所有檔案合併回一個大卷中,它也會快得多。

我怎樣才能最好地做到這一點?謝謝你。


找到解決方案

正如@Haxiel 的回答所建議的那樣,我找到了使用 tar 的解決方案。答案已在下方發布。

請注意,如果文件越過卷的邊界並且您沒有下一個卷可用,則可能仍有一兩個文件失去,但即使其他部分失去,至少可以獨立提取單獨的捲。

正如@Haxiel 的回答所建議的那樣,我找到了使用 tar 的解決方案。使用的命令是這樣的:

tar -c -L1G -H posix -f /backup/somearchive.tar -F '/usr/bin/tar-volume.sh' somefolder

**-L:**定義存檔大小限制,即 1 Gb

**-H:**必須使用posix格式,否則長文件名會被截斷

**-F:**需要卷腳本來為 tar 生成順序歸檔文件名

*此命令將創建格式為somearchive.tar、somearchive.tar-2、somearchive.tar-3…*的多卷存檔。

下面是我的tar-volume.sh,改編自本教程

#!/bin/bash

echo Preparing volume $TAR_VOLUME of $TAR_ARCHIVE
name=`expr $TAR_ARCHIVE : '\(.*\)\(-[0-9]*\)$'`

case $TAR_SUBCOMMAND in
-c)       ;;
-d|-x|-t) test -r ${name:-$TAR_ARCHIVE}-$TAR_VOLUME || exit 1
         ;;
*)        exit 1
esac

echo ${name:-$TAR_ARCHIVE}-$TAR_VOLUME >&$TAR_FD

要列出第三個存檔卷的內容:

tar -tf /backup/somearchive.tar-3

要提取特定存檔卷:

tar -xf /backup/somearchive.tar-3

請注意,如果您只提取 1 個單個卷,則可能有不完整的文件在存檔的開頭或結尾被拆分到另一個卷。Tar 將創建一個名為GNUFileParts.xxxx/filename的子文件夾,其中包含不完整的文件。

要在 Unix 中提取整組卷,您需要再次通過卷腳本執行它:

tar -xf /backup/somearchive.tar -F '/usr/bin/tar-volume.sh'

如果您在 Windows 中提取它們,則 tar 命令無法正確執行卷腳本,因為這需要 bash shell。您需要先在命令行中手動輸入卷文件名,方法是先執行以下命令:

tar -xf somearchive.tar -M

-M表示這是一個多卷存檔。當 tar 完成第一個卷的解壓後,它會提示您輸入下一個卷的名稱,直到所有捲都解壓完畢。

如果有很多卷,您可以先鍵入所有捲名序列,然後在提取第一個卷後將整個批次複製並粘貼到 tar 的命令行提示符中:

n somearchive.tar-2
n somearchive.tar-3
n somearchive.tar-4

注意前面的n,這是一個tar命令,表示後面的參數是一個新的捲文件名。

如果文件越過卷的邊界並且您沒有下一個卷可用,則可能仍有一兩個文件可能失去,但即使其他部分失去,至少可以獨立提取單獨的捲。

有關詳細資訊,請參閱tar 文件。H

這不是一個完美的解決方案,但 GNUtar的多卷檔案似乎與您正在尋找的很接近。您的問題中已經提到了此選項,但我想添加GNUtar手冊中的參考,以闡明為什麼這是一個可能的選項:

多卷存檔是一個 tar 存檔,儲存在多個固定大小的媒體卷上。儘管在本節中我們通常將“卷”稱為磁帶,但絕對不需要將多卷存檔儲存在磁帶上。相反,他們可以使用使用者認為方便的任何媒體類型,甚至可以位於文件上。

創建多卷存檔時,GNU tar 會繼續填充目前卷,直到空間用完,然後切換到下一個卷(通常此時要求操作員更換磁帶),並繼續處理新卷. 此操作將一直持續到所有請求的文件都被轉儲為止。如果 GNU tar 在轉儲文件時檢測到媒體結束,則此類文件將以拆分形式存檔。 一些非常大的文件甚至可以分成多個卷。

每個卷本身都是一個有效的 GNU tar 存檔,因此無需任何特殊選項即可讀取。因此,完全駐留在一個卷上的任何文件成員都可以在不需要另一個卷的情況下被提取或以其他方式操作。果然,要提取一個拆分成員,您需要其部分所在的所有捲。

多卷檔案受到幾個限制。特別是,它們不能被壓縮。

使用此定義,唯一會出現問題的文件是跨大小邊界拆分的文件。完全包含在單個卷中的文件可以被視為獨立於其他卷。

對於每個卷,可以使用該-v選項辨識拆分文件。

$ tar -tf multi-test2.tar -v
M--------- 0/0          658432 1970-01-01 03:00 file1--Continued at byte 7341568--
-rw-r--r-- test/users 4000000 2019-03-06 12:12 file2

可以像使用單個存檔一樣提取完全包含的文件。tar似乎抱怨拆分文件不完整,但它能夠毫無問題地提取完整文件。

拆分文件也可以使用該選項從多個卷中提取為一個單元,該-M選項將提示您提供下一個卷的名稱。用法記錄在這裡。相反,如果您希望將捲連接到單個存檔,您也可以考慮使用tarcat 實用程序

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