Tar удалить файлы после архивации
У меня есть большой файл foo.tar.xz , который содержит много (скажем 200000) файлов. Я понял, что в этом архиве содержится несколько (около 5000) файлов, которые я не хочу. У меня недостаточно дискового пространства для декомпрессии всего этого на моем диске; Кроме того, я боюсь, что атрибуты /права могут потеряться, если я это сделаю. Однако у меня достаточно места для размещения двух копий сжатого архива. Есть ли инструмент для удаления некоторых файлов из архива (заданных с помощью регулярного выражения в имени файла) «на лету», т. Е. Без распаковки архива в отдельные файлы?
3 ответа
(отредактирован, поскольку я неправильно понял вопрос, который был отредактирован также)
Самое лучшее, что вы можете сделать, это извлечь, удалить и повторно сжать весь файл.
unxz < foobar-old.tar.xz | tar --delete foo/bar | xz > foobar-new.tar.xz
Невозможно удалить файлы из tar напрямую.
деготь представляет собой поток, первоначально предназначенный для ленточных накопителей, которые не делают случайными изыскивает хорошо - хотя теоретически это может быть возможно на диск файловой системы пробивать отверстие /переписать оставшийся файл со сжатием точка является спорной, поскольку большинство если не все методы сжатия сильно зависят от содержимого, которое ранее было в файле. Для этого вам понадобятся очень подробные сведения о методе сжатия, а также формате файла tar. Это сложность, о которой никто не будет беспокоиться. Дешевле просто хранить файлы и игнорировать их.
Если вам нужна эта функциональность, tar, вероятно, не то, что вы хотите.
Используйте его так, например:
Остерегайтесь: . Скорее всего, not работает на любом магнитном ленточном носителе. Но tar не имеет проблем с работой в трубе, поэтому вы можете просто использовать временный файл tar и впоследствии перезаписать ленту. Он также не будет работать с сжатыми файлами, поэтому вам нужно распаковать файл.
Кроме того, операция будет довольно медленной в любом случае из-за (по дизайну) упакованного линейного характера архивов tar.
В соответствии с руководством вы можете пройти список имен файлов в tar , чтобы извлечь их. Например:
У меня есть большой файл, foo.tar.xz который содержит много (скажем, 200000) файлов. Я выяснил, что этот архив содержит несколько (около 5000) файлов, которые мне не нужны. У меня недостаточно места на диске, чтобы распаковать все это на мой диск; Кроме того, я боюсь, что атрибуты / права могут быть потеряны, если я это сделаю. У меня достаточно места для размещения двух копий сжатого архива. Существует ли инструмент для удаления некоторых файлов из архива (с регулярным выражением в имени файла) на лету, то есть без распаковки архива в отдельные файлы?
Используйте это так, например:
Осторожно: он, скорее всего, не будет работать с любым магнитным носителем. Но у tar него нет проблем с работой в конвейере, поэтому вы можете просто использовать временный tar-файл и перезаписать его этим. Он также не будет работать со сжатыми файлами, поэтому вам нужно будет распаковать файл.
Кроме того, операция в любом случае будет довольно медленной из-за (по замыслу) упакованного линейного характера архивов tar.
Он существует, но он не работает с файлами, где произвольный доступ невозможен (например, сжатие архивов), но это мой вариант использования. Другая проблема заключается в том, что я не могу указать шаблон для удаления. Обратите внимание на мой комментарий от 2013 года, где я уже рассмотрел недостатки gtar --delete . @FUZxxl -T работает с --delete и --wildcards позволяет вам использовать шаблоны, а не имена файлов, поэтому создайте временный файл, содержащий шаблоны и их использование unxz < file.tar.xz | tar --wildcards --delete -T patternfile | xz > file2.tar.xz . Он не будет выполнять полное регулярное выражение (если вам это нужно, просто используйте tar -t и создайте список имен файлов для удаления), только шаблоны соответствия файлов.(отредактировано, поскольку я неправильно понял вопрос, который был также отредактирован)
Лучшее, что вы можете сделать, - это извлечь, удалить и повторно сжать весь файл.
unxz < foobar-old.tar.xz | tar --delete foo/bar | xz > foobar-new.tar.xz
Невозможно удалить файлы из tar напрямую.
деготь представляет собой поток, первоначально предназначенный для ленточных накопителей, которые не делают случайных изыскивает хорошо - хотя теоретически это может быть возможно на диске файловой системы пробивать отверстие / переписать оставшийся файл со сжатием точка является спорным, поскольку большинство, если не все Методы сжатия сильно зависят от содержимого, которое ранее встречалось в файле. Чтобы сделать это на месте, вам понадобятся очень подробные знания как о методе сжатия, так и о формате файла tar. Это сложность до такой степени, что никто бы даже не стал беспокоиться об этом. Дешевле просто хранить файлы и игнорировать их.
Если вам нужна эта функциональность, вероятно, tar - это не то, что вам нужно.
Команда tar создает файлы tar путем преобразования группы файлов в архив. Он также может извлекать архивы tar, отображать список файлов, включенных в архив, добавлять дополнительные файлы к существующему архиву и выполнять различные другие операции.
Изначально Tar был разработан для создания архивов для хранения файлов на магнитной ленте, поэтому получил свое название « T ape AR chive».
В этой статье показано, как использовать команду tar для извлечения, перечисления и создания архивов tar на практических примерах и подробных объяснениях наиболее распространенных параметров tar.
Синтаксис команды tar
Существует две версии tar, BSD tar и GNU tar , с некоторыми функциональными отличиями. В большинстве систем Linux по умолчанию предустановлен GNU tar.
Общий синтаксис команды tar следующий:
Создание архива Tar
Tar поддерживает широкий спектр программ сжатия, таких как gzip , bzip2 , lzip , lzma , lzop , xz и compress . При создании сжатых tar-архивов принято добавлять суффикс компрессора к имени файла архива. Например, если архив был сжат с помощью gzip , он должен называться archive.tar.gz.
Чтобы создать tar-архив, используйте параметр -c за которым следует -f и имя архива.
Например, чтобы создать архив с именем archive.tar из файлов с именами file1 , file2 , file3 , вы должны выполнить следующую команду:
Вот эквивалентная команда, использующая параметры полной формы:
Вы можете создавать архивы из содержимого одного или нескольких каталогов или файлов. По умолчанию каталоги архивируются рекурсивно, если не указана опция --no-recursion .
В следующем примере будет создан архив с именем user_backup.tar из user_backup.tar /home/user :
Используйте параметр -v если вы хотите увидеть файлы, которые обрабатываются.
Создание архива Tar Gz
Параметр -z указывает tar сжимать архив с использованием алгоритма gzip мере его создания. Например, чтобы создать архив tar.gz из заданных файлов, вы должны выполнить следующую команду:
Создание архива Tar Bz2
Чтобы сжать архив с помощью алгоритма bzip2 , вызовите tar с параметром -j . Следующая команда создает архив tar.bz2 из указанных файлов:
Листинг архивов Tar
При использовании с параметром --list ( -t ) команда tar выводит список содержимого архива tar без извлечения его.
Команда ниже отобразит содержимое файла archive.tar :
Чтобы получить дополнительную информацию, такую как владелец файла, размер файла, временная метка, используйте параметр --verbose ( -v ):
Извлечение архива Tar
Большинство архивных файлов в Linux заархивированы и сжаты с использованием формата tar или tar.gz. Важно знать, как извлекать эти файлы из командной строки.
Чтобы извлечь tar-архив, используйте параметр --extract ( -x ), за которым следует имя архива:
Также часто добавляют параметр -v для вывода имен извлекаемых файлов.
Извлечение архива Tar в другой каталог
По умолчанию tar извлекает содержимое архива в текущий рабочий каталог . Используйте --directory ( -C ) для извлечения архивных файлов в определенный каталог:
Например, чтобы извлечь содержимое архива в каталог /opt/files , вы можете использовать:
Извлечение архивов Tar Gz и Tar Bz2
При извлечении сжатых архивов, таких как tar.gz или tar.bz2 , вам не нужно указывать параметр распаковки. Команда такая же, как при распаковке tar архива:
Извлечение определенных файлов из архива Tar
Иногда вместо извлечения всего архива вам может потребоваться извлечь из него только несколько файлов.
Чтобы извлечь определенный файл (ы) из архива tar, добавьте разделенный пробелами список имен файлов, которые нужно извлечь, после имени архива:
При извлечении файлов вы должны --list их точные имена, включая путь, как напечатано с помощью --list ( -t ).
Извлечение одного или нескольких каталогов из архива аналогично извлечению файлов:
Извлечение файлов из архива Tar с использованием подстановочного знака
Чтобы извлечь файлы из архива на основе шаблона с подстановочными знаками, используйте переключатель --wildcards и --wildcards шаблон в кавычки, чтобы оболочка не интерпретировала его.
Например, чтобы извлечь файлы, имена которых заканчиваются на .js (файлы Javascript), вы можете использовать:
Добавление файлов в существующий архив Tar
Чтобы добавить файлы или каталоги в существующий tar-архив, используйте --append ( -r ).
Например, чтобы добавить файл с именем newfile в archive.tar, вы должны запустить:
Удаление файлов из архива Tar
Используйте операцию --delete для удаления файлов из архива.
В следующем примере показано, как удалить файл file1 из archive.tar:
Выводы
Чаще всего команда tar используется для создания и извлечения архива tar. Чтобы извлечь архив, используйте команду tar -xf за которой следует имя архива, а для создания нового используйте tar -czf за которым следует имя архива, а также файлы и каталоги, которые вы хотите добавить в архив.
Для получения дополнительной информации о команде tar обратитесь к странице документации Gnu tar .
В этой статье основное внимание я уделю консольным средствам Linux для работы с различными типами архивов, а в следующих статьях постараюсь описать графические программы для работы с архивами. Это сделано по нескольким причинам:
1) В графических программах не сложно разобраться самому
2) Эта статья написана в первую очередь для администраторов или тех, у кого нет возможности (или желания?) по каким-то причинам установить ПО с GUI.
3) Не знаю как вам, а мне приятно осознавать, что для выполнения самых трудных операций над файлами не обязательно прибегать к установке дополнительных тяжелых программных средств, достаточно лишь поближе познакомиться с теми маленькими, но очень мощными программками, которые присутствуют в наших дистрибутивах уже очень много лет :)
УТИЛИТА TAR
Tar - стандартное и самое популярное средство для архивирования/распаковки данных в Linux. Я опишу основные опции tar.
Добавить файлы в существующий архив.
Добавление файлов в сжатый архив невозможно. Вы можете добавлять файлы только в несжатый архив. Поясню на примере: создаем несжатый архив добавляем в него файлы удаляем несжатый архив, создаем сжатый и пытаемся добавить в него файлы
На самом деле вы, конечно, можете "обновить" сжатый архив, добавив в него файлы. Но программы, которые это делают, всего-лишь распаковывают существующий архив и создают новый с учетом файлов, которые надо добавить. Следует понимать, что между архивированием и сжатием файлов есть большая разница. К примеру, вы можете создать несжатый архив из многих файлов командой tar cf archive.tar documents/ , если надо быстро передать это кому-то как единый файл. Но на современных компьютерах можно не экономить и сжимать файл самым быстрым способом. Например, насколько мне известно, gzip сжимает/разжимает быстрее всего.
Просмотреть список файлов в архиве.
Чтобы просмотреть список файлов в архиве, используйте опцию t.
Несколько простых примеров работы с архивами в GNU/Linux
Имеется несколько файлов, находящихся в одном каталоге, над которыми мы будем работать:
Создать архив из одного файла, сжатый GZIP Создать архив из двух файлов, сжатый BZIP2 Архивировать каталог documents вместе со всем его содержимым как GZIP архив Распаковать в текущий каталог архив GZIP Распаковать в текущий каталог архив BZIP2 Распаковать архив GZIP в каталог documents/new/
Создание бэкапа системы в Linux.
Я не хочу останавливаться на этом моменте, т.к. это тема отдельной статьи. Скажу лишь, что при архивировании всей системы ( / ) нужно учитывать точки монтирования файловых систем и такие виртуальные файловые системы как /proc и /dev . Также вам пригодится опция —ignore-failed-read , с ней tar не будет останавливаться в случае если встретит файл, который он не может прочитать. Опция --one-file-system тоже может быть полезна — она указывает Tar-у, чтобы он не выходил за пределы одной файловой системы. Это нужно, если вы архивируете корень, когда надо пропусить /proc и /dev . Создайте текстовый файл, в котором перечислите список того, что архивировать НЕ надо. Это могут быть каталоги tmp, файлы логов и даже сам файл с бэкапом. Имя файла допишите как аргумент к опции —exclude-from. Например, так —exclude-from=list.txt . По поводу выбора «сжимальщика» - gzip использовать вольготнее чем bzip2, т.к. Сжимает он намного быстрее (до 80%), проигрывая в размере архива примерно на 10-20%.
Создание множества архивов.
К примеру, есть такой список файлов Нам надо сделать из этого 1.tar.gz 2.tar.gz 3.tar.gz и т.д.
Для этого можно воспользоваться конструкцией for i in список; do команда; done . Например, так: В этом случае имена получившихся будут иметь такой вид имя-файла.tar.gz, т.е. 1.djvu.tar.gz .Нет ничего страшного в том, что в имени архива есть «расширение» того файла, который в архиве лежит, т.к. В Linux изначально нет никаких «расширений» и, проще говоря, .tar.gz — всего-лишь часть имени файла. А тип файла частенько правильнее узнать утилитой file .
Но у этого способа есть и минусы. Например, у вас не получится обработать таким способом файлы, которые содержат пробелы в своем имени. На этот случай можно использовать другой, более практичный способ заархивировать много файлов: Он будет работать даже если в именах файлов содержатся пробелы и спецсимволы. Не забудьте про опцию -type f утилиты find. Чтобы понять, зачем она нужна, выполните этот же скрипт без нее и затем выполните команду ls -a =)
Массовое переименование файлов в Linux
А вообще, старайтесь не использовать пробелы в именах файлов. Следующая конструкция переименовывает все файлы в текущем каталоге, заменяя пробелы на символы подчеркивания «_»: Пример использования массового переименования файлов с заменой пробелов на символы подчеркивания: Приведенная конструкция заменит пробелы на символы подчеркивания в именах файлов не только текущего но и всех вложенных каталогов. Если вам нужно переименовать файлы только в текущем каталоге, добавьте опцию -maxdepth 1 :
Читайте также: