Найдите файл с расширением .gz и распакуйте с помощью tar.

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

Я хочу найти файл gunzipped tarball в своем каталоге и распаковать его. Я пробовал:

system("find . -name '*.gz' | tar -xvf -")

это вызывает следующую ошибку:

tar: Missing type keyword in mtree specification
x ./Library/rmarkdown_2.17.1.tar.gz
tar: Error exit delayed from previous errors.

system — это функция в R для вызова команд Linux.

find ./ -iname '*.tgz' -exec tar -xvf {} \;

Это должно сработать.

.

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

Для начинающих пользователей командной строки, работающих с архивными файлами в Linux, может возникнуть путаница при извлечении файлов с расширением .gz. Это распространённое расширение относится к файлам, сжатыми с помощью утилиты gzip, и часто в комбинации с архивами tar, образуя так называемые tarball-файлы. Рассмотрим, как такие файлы можно найти и извлечь с использованием команды find и утилиты tar.

Теория

Файлы с расширением .gz представляют собой архивы, созданные с помощью утилиты gzip. Однако, когда вы видите файл с расширением .tar.gz (или .tgz), это означает, что файлы сначала были объединены в один архив с помощью tar, а затем этот архив был сжат с помощью gzip. Утилита tar исторически служит для создания и извлечения tarball-файлов, что подразумевает работу с группами файлов и целыми директориями как с единым объектом.

Проблема и как её понять

В представленном коде system("find . -name '*.gz' | tar -xvf -") происходит ошибка, потому что команда пытается провести распаковку посредством tar, используя поток вводных данных от команды find. Проблема здесь в том, что этот поток не предоставляет корректный ввод для команды tar, что приводит к выводу ошибок. Сообщение об ошибке "Missing type keyword in mtree specification" указывает на неверное использование потока данных.

Применение

Альтернативное предложение команды, указанное как рабочее решение, выглядит так:

find ./ -iname '*.tgz' -exec tar -xvf {} \;

Эта команда использует find для поиска всех файлов с расширением .tgz (иначе, та же комбинация как .tar.gz) внутри текущей директории и всех поддиректорий. Ключевой элемент здесь — использование ключа -exec, который выполняет указанную команду tar -xvf {} для каждого найденного файла. Синтаксис {} используется в find для размещения имени текущего найденного файла в команду.

Профессиональный совет

Для извлечения файлов с различными разновидностями расширений, можно комбинировать несколько паттернов в командной строке find, заглавные и строчные буквы. Например:

find ./ -iname '*.tar.gz' -o -iname '*.tgz' -exec tar -xzvf {} \;

В этой команде -o используется как логический оператор "или", что позволяет искать несколько видов расширений. Флаг -iname делает поиск нечувствительным к регистру, что может быть удобно при работе с файлами, созданные на разных системах. Флаг x указывает tar извлекать файлы из архива, флаг z сообщает tar, что архив был сжат gzip, а v даёт подробное описание процесса извлечения, выводя запись каждого файла во время распаковки, и f указывает, что следующий аргумент будет именем файла.

Заключение

Использование командной строки для управления файлами и извлечения содержимого архивов является важным навыком для любого IT-специалиста, работающего с Unix-подобными системами. Описанная выше команда find в паре с tar предоставляет мощный инструмент для эффективного управления архивами. Важно помнить различия между процессами создания и распаковки для различных типов архивов, таких как gzip и tar, чтобы избежать ошибок и некорректного использования утилит командной строки.

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

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