Вопрос или проблема
Я хочу найти файл 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, чтобы избежать ошибок и некорректного использования утилит командной строки.