Предположим, у меня есть сжатый tar-архивом gzip tarArchive.tgz (+100 файлов, всего + 5 ГБ).
Какой самый быстрый способ удалить все записи, соответствующие заданному шаблону имени файла, например префикс * .jpg, а затем снова сохранить остатки в tar-шаре gzip: ed?
Замена старого архива или создание нового не важны, в зависимости от того, что быстрее.
Ответы:
С GNU
tar
вы можете сделать:С
bsdtar
:(
pigz
будучи многопоточной версиейgzip
).Вы можете перезаписать файл поверх себя, например:
Но это довольно рискованно, особенно если результат оказывается менее сжатым, чем исходный файл (в этом случае второй
pigz
может закончиться перезаписью областей файла, которые первый еще не прочитал).источник
Не пренебрегайте простым способом: он может быть достаточно быстрым для вашей цели. С помощью avfs для доступа к архиву в виде каталога:
С более примитивными инструментами, сначала извлеките файлы, исключая
.jpg
файлы, затем создайте новый архив.Если ваша смола имеет
--exclude
:Однако это может повлиять на владение файлом и режимы, если вы не запускаете его как root. Для достижения наилучших результатов используйте временный каталог в быстрой файловой системе - tmpfs, если у вас есть достаточно большой.
Поддержка архиваторов, выполняющих роль транзитного прохода (т.е. чтение архива и запись архива), как правило, ограничена. GNU tar может удалять элементы из архива с
--delete
опцией операции («--delete
Сообщалось, что эта опция работает должным образом, когдаtar
действует как фильтр изstdin
вstdout
.»), И это, вероятно, ваш лучший вариант.Вы можете сделать мощные архивные фильтры в несколько строк Python. Его
tarfile
библиотека может читать и писать из потоков без возможности поиска, и вы можете использовать произвольный код в Python для фильтрации, переименования, изменения…источник
tar
, вы можете добавитьp
опцию.С tar, который поставляется на Mac OSX, вы можете сделать это:
источник
Для этого вам, вероятно, придется извлечь все содержимое файла .tgz в локальный каталог, затем стереть ненужные файлы, а затем повторно сжать файл .tgz.
Это долго, и вам нужно достаточно свободного места на диске, но, насколько мне известно, нет другого способа сделать это.
Учитывая, что у вас уже есть такой путь
/tmpdir/withalotofspace
, достаточно свободного места (проверьте его, используяdf -h /tmpdir/withalotofspace
), вы можете сделать что-то вроде этого:источник
Мне нравится ответ @Gilles, за исключением того, что он может быть еще более упрощен. После распаковки, например,
gunzip foo.tgz
файл будетfoo.tar
и файлы могут быть удалены сtar -f foo.tar --delete file|directory
. Ниже приведен пример удаления каталога из файла tar.Определенные типы файлов могут быть найдены с
tar -tf foo.tar|egrep -i '.jpg$'
.источник