Вопрос или проблема
Я создал tar-файл из директории и затем извлек некоторые файлы по их именам, используя опцию v
. Если я выполняю ту же команду снова, я все равно получаю тот же вывод. Почему это происходит? Почему я могу извлечь файл снова, если он уже был извлечен?
Для справки, вот эта команда: tar xvf ../playground2.tar --wildcards 'home/me/playground/dir-*/file-A'
. Я запустил её второй раз, и она закончилась с тем же выводом!
Команда Linux tar
означает tape archive, которая используется для создания архива на ленте резервного копирования (или файле), а также извлечения файлов из этого архива. В вашем случае это резервная копия, сохраненная в файл.
Как показано в man-странице tar – Опция -v
(-v, –verbose) просто подробно перечисляет файлы, когда они обрабатываются.
tar
не имеет опции удаления архива после извлечения. Это должно быть сделано вручную, предпочтительно после того, как вы убедились, что файлы были успешно извлечены. Это также можно сделать в одну строку, если вы хотите:
tar xvf ../playground2.tar --wildcards 'home/me/playground/dir-*/file-A' && rm ../playground2.tar
&&
в вышеуказанной команде означает, что rm ../playground2.tar
будет выполнено, только если tar xvf ../playground2.tar --wildcards 'home/me/playground/dir-*/file-A'
выполнится успешно, без ошибки(ошибок).
GNU tar – это программа для архивирования, предназначенная для хранения нескольких файлов в одном файле (архиве) и для манипулирования такими архивами.
Опции, перечисленные в таблице ниже, указывают GNU tar, какую операцию следует выполнять.
-A, –catenate, –concatenate Дополнить архивы в конце другого архива.
-c, –create Создать новый архив.
-d, –diff, –compare Найти различия между архивом и файловой системой.
–delete Удалить из архива.
-r, –append Добавить файлы в конец архива.
-t, –list Перечислить содержимое архива.
–test-label Проверить метку тома архива и выйти.
-u, –update Добавить файлы, которые новее соответствующих копий в архиве.
-x, –extract, –get Извлечь файлы из архива. Это не устраняет его.
–usage Показать список доступных опций и выйти.
.
Ответ или решение
Теория:
Команда tar
(tape archive) в операционных системах на базе Unix и Linux используется для создания архива, который может содержать несколько файлов и/или директорий (папок). Она также позволяет извлекать файлы из таких архивов. Форматы данных tar являются важным элементом в управлении данными, позволяя объединять несколько файлов в один для упрощения хранения и передачи. Важно отметить, что стандартная команда tar
не предусматривает удаления файлов из архива после их извлечения — архив остается неизменным на диске после выполнения команды извлечения. Это позволяет многократное извлечение файлов из одного и того же архива без его изменения.
Пример:
В вашем случае, команда выглядит следующим образом: tar xvf ../playground2.tar --wildcards 'home/me/playground/dir-*/file-A'
. Здесь:
x
— извлечение (extract) файлов из архива.v
— режим подробного вывода информации (verbose), который показывает подробности процесса извлечения.f
указывает на то, что следующее за ним имя — это имя tar-файла.--wildcards
позволяет использовать маски для извлечения файлов.'home/me/playground/dir-*/file-A'
— путь и маска для извлекаемых файлов.
Применение:
Когда вы запускаете вышеуказанную команду более одного раза, tar
просто извлекает указанные файлы снова, не проверяя их существование в целевой директории, поскольку структура tar-файла не изменяется от операции извлечения. Поэтому любой файл, уже существующий в целевой директории, может быть перезаписан или оставлен без изменений (в зависимости от параметров команды), но сам tar-архив остается на диске. Если ваша цель в том, чтобы использовать tar-архив только один раз, рекомендуется вручную удалить архив после успешного извлечения. Это достигается благодаря команде rm
, как показано:
tar xvf ../playground2.tar --wildcards 'home/me/playground/dir-*/file-A' && rm ../playground2.tar
В данной конструкции &&
гарантирует, что rm
выполняется только в случае успеха предыдущей команды tar
.
Такой подход позволяет избежать ненужных операций извлечения в будущем, экономя ваше время и системные ресурсы.