- Использование tar в Linux и FreeBSD для работы с архивами
- Создание и распаковка архивов
- Создать
- Распаковать
- Примеры
- Распаковать в определенную папку
- Распаковка без вложенной папки
- Исключение файлов по маске
- Работа с архивами, разбитыми на части
- Описание ключей tar
- Команды для действия
- Дополнительные опции
- Windows
- tar, опция —exclude
- Excluding directory when creating a .tar.gz file
- 10 Answers 10
- Команда оболочки для каталога tar, исключая определенные файлы / папки
Использование tar в Linux и FreeBSD для работы с архивами
Утилита командной строки tar используется для работы с архивами в операционных системах на базе UNIX. С ее помощью можно архивировать данные и оптимизировать использование дискового пространства.
Создание и распаковка архивов
Создать
Создание выполняется с ключом c. Синтаксис следующий:
tar -czvf archive.tar.gz /home/dmosk
* в данном примере будет создан архив archive.tar.gz домашней директории пользователя (/home/dmosk)
** где z — сжать архив в gzip (без этого параметра, tar не сжимает, а создает так называемый тарбол); c — ключ на создание архива; v — verbose режим, то есть с выводом на экран процесса (очень удобно для наблюдением за ходом работы, но в скриптах можно упустить); f — использовать файл (обязательно указываем, так как в большей степени работаем именно с файлами).
Распаковать
Распаковка выполняется с ключом x с синтаксисом:
tar -xvf archive.tar.gz
Примеры
Распаковка .gz файла:
tar -xvf archive.tar.gz
* при возникновении ошибки This does not look like a tar archive, можно воспользоваться командой gzip -d archive.tar.gz.
tar -xvjf archive.tar.bz2
* ключ j отвечает за работу с bz2.
Если система ругается на bzip2, значит нужно его установить:
yum install bzip2
apt-get install bzip2
pkg install bzip2
* соответственно, для CentOS (RPM based), Ubuntu (deb based), FreeBSD (BSD based).
Если видим ошибку tar: Unrecognized archive format, воспользуемся следующей командой:
bzip2 -d archive.tar.bz2
tar -xvzf archive.tar.gzip
* ключ z отвечает за работу с gzip.
Распаковывается, как gzip:
tar -xvzf archive.tgz
Распаковать в определенную папку
tar -C /home/user -xvf archive.tar.gz
* ключ -C используется для указания папки, куда необходимо распаковать файлы из архива.
Распаковка без вложенной папки
Такой способ можно использовать для распаковки в заранее подготовленный каталог. Будет некий эффект переименовывания каталога или аналог «Распаковать здесь»:
tar -C /home/admin/mytar -xvf admin.tar.gz —strip-components 1
* каталог /home/admin/mytar заранее должен быть создан; —strip-components 1 пропустит одну вложенную папку внутри архива.
Исключение файлов по маске
Если необходимо пропустить некоторые файлы, вводим команду с ключом —exclude:
tar —exclude=’sess_*’ -czvf archive.tar.gz /wwwsite
* в данном примере мы создадим архив archive.tar.gz, в котором не будет файлов, начинающихся на sess_.
Также можно исключить несколько файлов или папок, добавляя несколько опций exclude:
tar —exclude=’/data/recycle’ —exclude=’*.tmp’ zcf /backup/samba/2021-08-29.tar.gz /data/
* в данном примере мы исключим папку recycle и файлы, которые заканчиваются на .tmp
Работа с архивами, разбитыми на части
Разбить архив на части может понадобиться по разным причинам — нехватка места на носителе, необходимость отправки файлов по почте и так далее.
Чтобы создать архив, разбитый на части, вводим команду:
tar -zcvf — /root | split -b 100M — root_home.tar.gz
* данная команда создаст архив каталога /root и разобьет его на части по 100 Мб.
В итоге мы получим, примерно, такую картину:
root_home.tar.gzaa root_home.tar.gzac root_home.tar.gzae
root_home.tar.gzag root_home.tar.gzai root_home.tar.gzab
root_home.tar.gzad root_home.tar.gzaf root_home.tar.gzah
Чтобы собрать архив и восстановить его, вводим команду:
cat root_home.tar.gz* | tar -zxv
Описание ключей tar
Команды для действия
Ключ | Описание |
---|---|
-A | Добавление файлов в архив. |
-c | Создание нового архивного файла. |
-d | Показать отличающиеся данные между каталогом-исходником и содержимым архива. |
—delete | Удалить файлы внутри архива. |
-r | Добавить файлы в конец архива. |
-t | Показать содержимое архива. |
-u | Добавить файлы, которых нет в архиве. |
-x | Извлечь файлы из архива. |
* нельзя использовать несколько вышеперечисленных ключей в одной команде.
Дополнительные опции
Ключ | Описание |
---|---|
—atime-preserve | Оставить прежнюю метку времени доступа для файла. |
-b N | Задать размер блока N x 512. |
-C | Смена каталога. По умолчанию, используется тот, в котором мы находимся. |
—checkpoint | Показать имена папок при чтении архивного файла. |
-G | Использование старого формата инкрементального резервирования при отображении или извлечения. |
-g | Использование нового формата инкрементального резервирования при отображении или извлечения. |
-h | Не дублировать символьные ссылки. Только файлы, на которые указывают эти симлинки. |
-i | Игнорировать блоки нулей. |
-j | Использование bzip2. |
—ignore-failed-read | Игнорировать не читаемые файлы. |
-k | При распаковке, существующие файлы не заменяются соответствующими файлами из архива. |
-L N | Смена магнитной ленты после N*1024 байт. |
-m | При извлечении игнорировать время модификации объекта. |
-M | Многотомные архивы. |
-N DATE | Сохранять только более новые файлы относительно DATE |
-O | Направление извлекаемого на стандартный вывод. |
-p | Извлечение защищенной информации. |
-P | Не отбрасывает начальный слэш (/) из имен. |
-s | Сортировка файлов при извлечении. |
—preserve | Аналогично -ps |
—remove-files | Удалить исходные файлы после добавления в архив. |
—same-owner | Сохранить владельца при извлечении. |
—totals | Вывод байт при создании архива. |
-v | Протоколирование действий — отображение списка объектов, над которыми происходит действие. |
-V NAME | Создание архива на томе с меткой NAME. |
—version | Показать версию tar. |
-w | Требовать подтверждения для каждого действия. |
-W | Проверка архива после записи. |
—exclude FILE | Исключить файл FILE. |
-X FILE | Исключить файлы FILE. |
-Z | Фильтрует архив с помощью compress. |
-z | Использование gzip. |
* актуальный список опций можно получить командой man tar.
Tar не работает с zip-архивами. В системах UNIX для этого используем утилиты zip и unzip. Для начала, ставим нужные пакеты:
yum install zip unzip
apt-get install zip unzip
pkg install zip unzip
* соответственно, для RPM based, deb based, BSD based.
zip -r archive.zip /home/dmosk
* создает архив каталога /home/dmosk в файл archive.zip.
Windows
В системе на базе Windows встроенными средствами можно распаковать только ZIP-архивы. Для работы с разными архивами рекомендуется поставить архиватор, например 7-Zip.
Источник
tar, опция —exclude
Привет, ЛОР!
Перестала работать опция —exclude в tar.
Раньше вот такая команда работала без проблем:
$ tar -cvzf name.tar.gz /home/user —exclude=/home/user/dir
Может что-то поменяли в новой версии или баг появился?
tar -cvzf —exclude=/home/user/dir name.tar.gz /home/user
tar -cvz —exclude=/home/user/dir -f name.tar.gz /home/user
tar -cvz —exclude=/home/user/dir -f name.tar.gz /home/user
Лишние телодвижения, вот так всё работает тоже:
pi11 ,
hx6A2E , спасибо. 🙂
Раньше вот такая команда работала без проблем
Она и раньше не работала)
tar считает «—exclude=/home/user/dir» за файл (продолжение списка файлов)
поэтому и надо, как написали выше:
да вы правы. Однако, man tar и tar —help, для обоих версий — и там и там список файлов в самом конце, после параметров
Источник
Excluding directory when creating a .tar.gz file
I have a /public_html/ folder, in that folder there’s a /tmp/ folder that has like 70gb of files I don’t really need.
Now I am trying to create a .tar.gz of /public_html/ excluding /tmp/
This is the command I ran:
The tar is still being created, and by doing an ls -sh I can see that MyBackup.tar.gz already has about 30gb, and I know for sure that /public_html/ without /tmp/ doesn’t have more than 1GB of files.
What did I do wrong?
10 Answers 10
Try removing the last / at the end of the directory path to exclude
Try moving the —exclude to before the include.
Yes, remove the trailing / and (at least in ubuntu 11.04) all the paths given must be relative or full path. You can’t mix absolute and relative paths in the same command.
will not exclude logs directory but
The correct command for exclude directory from compression is :
Make sure to put —exclude before the source and destination items.
and you can check the contents of the tar.gz file without unzipping :
You can also exclude more than one using only one —exclude . Like this example:
In —exclude= you must finish the directory name without / and must in between MyBackup.tar.gz and /home/user/public_html/
tar -pczf —exclude /path/to/exclude —exclude /another/path/to/exclude/* /path/to/include/ /another/path/to/include/*
Tested in Ubuntu 19.10.
- The = after exclude is optional. You can use = instead of space after keyword exclude if you like.
- Parameter exclude must be placed before the source.
- The difference between use folder name (like the 1st) or the * (like the 2nd) is: the 2nd one will include an empty folder in package but the 1st will not.
Источник
Команда оболочки для каталога tar, исключая определенные файлы / папки
Существует ли простая команда / скрипт оболочки, которая поддерживает исключение определенных файлов / папок из архива?
У меня есть каталог, который должен быть заархивирован с подкаталогом, содержащим несколько очень больших файлов, которые мне не нужно резервировать.
Не совсем решения:
Команда tar —exclude=PATTERN соответствует заданному шаблону и исключает эти файлы, но мне нужно игнорировать определенные файлы и папки (полный путь к файлу), в противном случае допустимые файлы могут быть исключены.
Я также мог бы использовать команду find, чтобы создать список файлов и исключить те, которые я не хочу архивировать, и передать список в tar, но это работает только с небольшим количеством файлов. У меня десятки тысяч.
Я начинаю думать, что единственное решение — создать файл со списком исключаемых файлов / папок, затем использовать rsync —exclude-from=file для копирования всех файлов в каталог tmp, а затем использовать tar для архивирования этого каталога.
Кто-нибудь может придумать лучшее / более эффективное решение?
РЕДАКТИРОВАТЬ: решение Чарльза Ма работает хорошо. Главное, что —exclude=’./folder’ ДОЛЖНО быть в начале команды tar. Полная команда (сначала cd, поэтому резервное копирование относится к этому каталогу):
Вы можете иметь несколько опций исключения для tar, так
и т. д. будет работать. Убедитесь, что поставили —exclude перед отправителем и пунктом назначения.
Вы можете исключить каталоги с помощью —exclude tar.
Если вы хотите заархивировать все, кроме /usr вы можете использовать:
В вашем случае возможно что-то вроде
Возможные варианты исключения файлов / каталогов из резервной копии с помощью tar:
Исключить файлы, используя несколько шаблонов
Исключить файлы, используя исключаемый файл, заполненный списком шаблонов
Исключите файлы с помощью тегов, поместив файл тегов в любой каталог, который следует пропустить
старый вопрос с множеством ответов, но я обнаружил, что ни один из них не был достаточно ясен для меня, поэтому я хотел бы добавить свою попытку.
если у вас есть следующая структура
со следующими файлами / папками
Итак, вы хотите создать tar-файл, который содержит все внутри / home / ftp / mysite (чтобы переместить сайт на новый сервер), но file3 это просто мусор, и все в нем folder3 также не нужно, поэтому мы пропустим эти два.
мы используем формат
где c = create, z = zip и v = verbose (вы можете видеть файлы по мере их ввода, полезно, чтобы убедиться, что ни один из исключаемых вами файлов не добавляется). и f = файл.
Итак, моя команда будет выглядеть так
обратите внимание, что исключенные файлы / папки относятся к корню вашего tar (здесь я пробовал полный путь относительно /, но я не могу заставить это работать).
надеюсь, это поможет кому-то (и мне в следующий раз, когда я погуглю)
Вы можете использовать стандартную «муравьиную нотацию» для исключения относительных каталогов.
Это работает для меня и исключает любые каталоги .git или node_module:
/ dev2 / java
/ dev2 / javascript
Я испытал это, по крайней мере, с версией Cygwin tar, которую я использую («CYGWIN_NT-5.1 1.7.17 (0.262 / 5/3) 2012-10-19 14:39 i686 Cygwin» в Windows XP Home Edition SP3 machine), порядок опций важен.
Пока эта конструкция у меня работала
тот не работал
Это пока tar —help раскрывает следующее:
Итак, вторая команда также должна работать, но, похоже, это не так .
Этот шаблон исключения обрабатывает суффикс имени файла, такой как png или mp3, а также имена каталогов, такие как .git и node_modules
Для тех, у кого есть проблемы с этим, некоторые версии tar будут работать только без ‘./’ в значении exclude.
Синтаксис команды, которая работает:
Это не будет работать:
Я нашел это где-то еще, так что я не буду брать кредит, но это работало лучше, чем любое из решений выше для моих проблем, связанных с Mac (даже если это закрыто):
Для Mac OSX мне пришлось сделать
tar -zcv —exclude=’folder’ -f theOutputTarFile.tar folderToTar
Обратите внимание на -f после —exclude=
Я согласен, что флаг —exclude является правильным подходом.
Слово с предупреждением о побочном эффекте, который я не нашел сразу очевидным: исключение «fileA» в этом примере будет искать «fileA» РЕКУРСИВНО !
Пример: каталог с одним подкаталогом, содержащий файл с тем же именем (data.txt)
При использовании —exclude=’data.txt’ архива не будет содержать ЯВНО data.txt файл. Это может привести к неожиданным результатам при архивировании сторонних библиотек, таких как каталог node_modules.
Чтобы избежать этой проблемы, обязательно укажите весь путь, например, —exclude=’./dirA/data.txt’
Чтобы избежать возможных ‘xargs: Argument list too long’ ошибок из-за использования find . | xargs . при обработке десятков тысяч файлов, вы можете направить вывод find непосредственно в tar использование find . -print0 | tar —null . .
Прочитав эту ветку, я провел небольшое тестирование на RHEL 5, и вот мои результаты для отслеживания каталога abc:
Это исключит ошибку каталогов и журналов и всех файлов в каталогах:
Добавление подстановочного знака после исключенного каталога исключит файлы, но сохранит каталоги:
Используйте команду find в сочетании с опцией tar append (-r). Таким образом, вы можете добавлять файлы в существующий tar за один шаг, вместо двухпроходного решения (создать список файлов, создать tar).
Вы также можете использовать один из параметров —exclude-tag в зависимости от ваших потребностей:
- —exclude-тег = FILE
- —exclude-теги все = FILE
- —exclude-метка-под = ФАЙЛ
Папка с указанным файлом будет исключена.
Прочитав все эти хорошие ответы для разных версий и решив проблему для себя, я думаю, что есть очень мелкие детали, которые очень важны и редки для общего использования GNU / Linux , которые недостаточно подчеркнуты и заслуживают большего, чем комментарии.
Поэтому я не буду пытаться ответить на вопрос для каждого случая, а вместо этого попытаюсь зарегистрироваться, где искать, когда что-то не работает.
ЭТО ОЧЕНЬ ВАЖНО ДЛЯ УВЕДОМЛЕНИЯ:
- ПОРЯДОК ВАРИАНТОВ ВАРИАНТОВ: это не то же самое, поместите —exclude до, чем после опции файла и каталогов для резервного копирования. По крайней мере, для меня это неожиданно, потому что, по моему опыту, в командах GNU / Linux порядок опций не имеет значения.
- В разных версиях tar эти параметры ожидаются в разном порядке: например, ответ @ Andrew указывает на то, что в GNU tar v 1.26 и 1.28 исключения идут последними, тогда как в моем случае, с GNU tar 1.29, это другой путь.
- ТРЕЙЛИНГ РЕЗУЛЬТАТОВ имеет значение : по крайней мере, в GNU tar 1.29, это не должно быть .
В моем случае для GNU tar 1.29 на Debian stretch сработала команда
Цитаты не имели значения, они работали с ними или без них.
Источник