Как использовать команду tar, чтобы показать скрытые файлы ресурсных разветвлений в архиве?

Вопрос или проблема

Это возможно? Если да, то как?

Если это важно, я использую macOS Sonoma 14.7.2.

В качестве теста я создал следующую папку:

$ tree tmp                                                                                                                                                                                                                           
tmp
└── myfile.txt

Затем я создал архив, выполнив:

$ tar -czvf tmp.tar.gz tmp                                                                                                                                                                                                           07:59:02
a tmp
a tmp/myfile.txt

Я запустил следующий код на Python:

import tarfile

tar_file = tarfile.open( "tmp.tar.gz" )
for member in tar_file.getmembers():
    print( member )

и он вывел:

<TarInfo '._tmp' at 0x11b938b80>
<TarInfo 'tmp' at 0x11b939000>
<TarInfo 'tmp/._myfile.txt' at 0x11b938c40>
<TarInfo 'tmp/myfile.txt' at 0x11b938ac0>

правильно показывая мне скрытый файл ресурса (._myfile.txt) в архиве.

Однако, когда я пробую несколько вариантов с командой tar, я не могу заставить её показать скрытый файл ресурса.

$ tar -tvf tmp.tar.gz                                                                                                                                                                                                                
drwxr-xr-x  0 eric.gorr staff       0 Feb 12 07:58 tmp/
-rw-r--r--  0 eric.gorr staff       0 Feb 12 07:58 tmp/myfile.txt

$ env COPYFILE_DISABLE=true tar -tvf tmp.tar.gz                                                                                                                                                                                      
drwxr-xr-x  0 eric.gorr staff       0 Feb 12 07:58 tmp/
-rw-r--r--  0 eric.gorr staff       0 Feb 12 07:58 tmp/myfile.txt

Ответ или решение

Чтобы решить описанную проблему и увидеть скрытые файлы ресурсов (например, ._myfile.txt) в архиве tar на macOS, важно понимать, как macOS располагается с такими файлами и какую роль они играют. Эти скрытые файлы создаются macOS для хранения метаданных файла, которые в других системах могут быть размещены непосредственно в файловой системе.

Теория

В macOS каждый файл может иметь два отдельных потока данных: данные файла и "ресурсный форк". Ресурсные форки содержат информацию о метаданных, такой как иконки, и другие графические элементы, используемые приложениями macOS. Когда вы копируете или архивируете файл в macOS, система может создать эти "._" файлы, чтобы сохранять информацию о ресурсах и атрибутах файла, особенно если архивируется в файловую систему, которая не поддерживает потоковую обработку данных так, как HFS+ или APFS.

Пример

В вашем случае вы создали и архивировали каталог на macOS, в которой tar по умолчанию может создавать эти "._" файлы для совместимости. Когда вы архивировали файл с помощью команды:

tar -czvf tmp.tar.gz tmp

tar автоматически включил эти скрытые файлы ресурсов вместе с вашими обычными файлами, что и отразилось в выводе вашего Python-скрипта. Однако когда вы используете tar для просмотра содержимого архива с помощью:

tar -tvf tmp.tar.gz

Вы не видите скрытых файлов ресурсов в выводе. Это происходит, вероятно, из-за того, что используемый вами tar основан на bsdtar, который по умолчанию может не отображать такие файлы как часть обычной структуры.

Применение

Вам необходим способ заставить tar показать также эти скрытые файлы ресурсов в списке. К сожалению, стандартные опции tar для macOS (в частности bsdtar) могут ограничивать отображение таких файлов без явных параметров для их идентификации. Однако можно предпринять несколько шагов:

  1. Убедитесь в версии tar: Убедитесь, что вы используете gnu tar, а не bsdtar, так как поведение может отличаться. Чтобы установить GNU tar на macOS, можно использовать Homebrew:

    brew install gnu-tar

    После установки обратитесь к нему как gtar.

  2. Просмотр всех файлов напрямую: Используя дополнительный инструмент или скрипт, можно идентифицировать совпадения с этими файлами. Например:

    gtar --no-same-owner --no-same-permissions -tvf tmp.tar.gz

    Если установлен gnu tar, этот вариант может предоставить более детализированный список файлов.

  3. Обходные пути с ls: Поскольку вывод tar -t в вашем случае не показывает эти файлы, возможно, придется рассматривать другие способы для их распознавания на этапе архивации.

  4. Извлечение и проверка: Особенно полезно извлечь архив и проверить структуру:

    tar -xzvf tmp.tar.gz
    ls -la tmp/

    Это покажет скрытые файлы в директории напрямую.

  5. Параметр COPYFILE_DISABLE: Этот параметр обычно отключает хранение resource fork информации, например, создавая архив без этих "._" файлов. Когда он установлен в true, это может привести к другому поведению с архивом, но в данном случае вы уже применили его, и разницы не было, так как архивировались все данные.

Таким образом, чтобы обеспечить отображение всех возможных файлов в архиве, для уверенности рекомендуется проверять конфигурацию вашей текущей версии tar и убедится в соответствии с вашим рабочим окружением и установленными утилитами.

Использование GUI-инструментов для архивации на macOS, таких как Keka или The Unarchiver, может также помочь выявить все включенные в архив файлы на более визуальном уровне с рассмотрением всех скрытых данных.

Оцените материал
Добавить комментарий

Капча загружается...