如何創建可以通過 solaris tar 提取的 gnu tarball
我正在維護一個舊的 cygwin(使用 GNU tar v1.21)系統和一個舊的 Solaris 9 系統。Solaris 9 系統的配置是固定的,不能升級(即我不能為Solaris 安裝gnu tar)。
我正在嘗試在 cygwin 系統上創建一個可以在 Solaris 9 系統上提取的 tarball,但不幸的是目錄結構(也是固定的,無法重命名)加上文件名超過 100 個字元,我遇到了Great Tar Wars上個千年的。Solaris 系統上有大量(保守的)使用者群,因此首選使用 Solaris tar 的解決方案。
這是我遇到的錯誤。
在 cygwin 上創建 tar:
$ tar -cf dir.tar dir
或者
$ tar -c --posix -f dir.tar dir
在 Solaris 上提供以下內容:
$ tar -xif dir.tar tar: directory checksum errors
並且 dir 中的文件名被截斷。(即忽略校驗和錯誤無濟於事)
如何使用可以由 Solaris tar 提取的 GNU tar 創建具有長路徑名的 tarball?
編輯#2:無法使用 Schily Tar(星號)
Joerg Schilling 似乎能夠模擬 Solaris 7/8/9 tar 格式,並提供了使用star
suntar
創建 Solaris tarball 的選項。不幸
star
的是,在 cygwin 上不可用。:(編輯#1:提取時使用 –format=posix 會出錯
在 Solaris 9 上使用 pax 提取 –format=posix gnu tarball 時出錯
在cygwin上:
$ ls example/this_is_a_path_name_greater_than_one_hundred_characters/when_combined_with_this_file_name_which_is_also_rather_long.txt | wc -m 128 $ tar -c --format=posix -f example.tar example
在 Solaris 上:
$ pax -r -f example.tar pax: ./PaxHeaders.4440/example : Unknown filetype pax: example/PaxHeaders.4440/this_is_a_path_name_greater_than_one_hundred_characters : Unknown filetype pax: example/this_is_a_path_name_greater_than_one_hundred_characters/PaxHeaders.4440/when_combined_with_t : Unknown filetype
使用 Solaris tar 解壓時會出現類似錯誤。
Solaris tar 和 GNU tar 對 posix 有不同的解釋,但都支持 ustar,而後者又支持 long(ish) pathnames。
在 cygwin 上使用 GNU tar:
$ tar -c --format=ustar -f dir.tar dir
這將創建一個 tarball,它可以在 Solaris 9 上順利解壓縮而沒有錯誤。也許不是通用解決方案,而是適合受限解決方案空間的解決方案。看來80年代畢竟有用!
GNU tar 格式建議
tar -c --format=posix
或者tar -c --format=pax
是創建包含超過 255 個字元的路徑名的可移植 tar 文件的唯一方法。Solaris tar 手冊頁沒有提到支持該格式,但Solaris pax 手冊頁有。
因此,首先,我會嘗試在 Cygwin(或 Linux)系統
tar -c --format=posix -f dir.tar dir
上使用.pax -r -x pax -f dir.tar``pax -r -f dir.tar
或者,如果您
cpio
在兩個系統上都安裝了,那麼該格式似乎在crc
兩個系統上都支持 1,023 個字元路徑。這看起來像是find -L dir | cpio -o -H crc > dir.cpio
創建和cpio -i -d < dir.cpio
提取它。最後,您可以嘗試添加
-i
標誌以在 Solaris 上提取時忽略目錄校驗和錯誤,例如tar -x -i -f dir.tar
. 校驗和問題表明,如果 tar 存檔中的任何文件名不是 ASCII,則可能需要這樣做。其他閱讀: