Солидные проекты освободить архивы дегтя, содержащие один каталог, например , zyrgus-3.18.tar.gz
содержит zyrgus-3.18
папку , которая , в свою очередь , содержит src
, build
, dist
и т.д.
Но некоторые панк-проекты помещают все в корень: '- (Это приводит к полному беспорядку при разархивировании. Создание папки каждый раз вручную - это боль и ненужная большая часть времени.
- Существует ли сверхбыстрый способ определить, содержит ли файл .tar или .tar.gz несколько корневых каталогов? Даже для большого архива.
- Или даже лучше, есть ли инструмент, который в таких случаях будет создавать каталог (имя архива без расширения) и помещать все внутри?
But some punk projects put everything at the root :'-(
И некоторые панк-проекты совершенно бесполезно помещают все в папку, учитывая, что они уже помещают все в прилагаемый архив, поэтому, когда вы загружаете и распаковываете его в свою собственную папку, как это делал бы любой умный пользователь, вы в конечном итоге получаете все содержание похоронило еще один слой вниз. ;-)Ответы:
patool обрабатывает различные виды архивов и создает подкаталог на тот случай, если архив содержит несколько файлов, чтобы не загромождать рабочий каталог извлеченными файлами.
Извлечь архив
Чтобы получить список поддерживаемых форматов, используйте
patool formats
.источник
alien
конвертировал его в deb для Ubuntu.patool
должен быть в репозиториях для Debian и Ubuntu, если вы используете текущую версию.Вы могли бы сделать что-то вроде
посмотреть, какие записи верхнего уровня есть у tar; труба, чтобы
wc -l
проверить, если есть больше чем один. Обратите внимание, что есть несколько случаев, когда это может не сработать, например, если tar содержит пути к файлам формы,somedir/whatever
а также./somedir/whatever
(или что-то более безумное); это должно быть необычным, хотя.Это прочитает весь tar-файл перед выводом чего-либо, потому что
sort
, хотя это должно быть быстрее, чем на самом деле извлечение, потому что это только одно последовательное чтение, и оно может пропускать большие файлы.Если вы делаете это в интерактивном режиме, и файл может быть большим, вы можете изменить
sort -u
кuniq
и Control+ Cесли он печатает более чем одну вещь.источник
sort | uniq
можно сократить доsort -u
.uniq -c
ты можешь сделать:
... для просмотра содержимого
tar
файла.если вы хотите узнать, сколько уровней он проходит, вы можете сделать:
Вы можете явно запретить взрыв при извлечении с помощью:
источник
Это должно делать то, что вы хотите. Я уверен, что кто-то может улучшить это. В этих примерах я предполагаю сжатый архивом gzip tar, поскольку он является наиболее распространенным.
Вы хотите архив, в котором нет дочерних узлов в дереве каталогов корневого уровня.
Каждая запись в списке содержимого tar должна начинаться с одного и того же шаблона. Этот шаблон является базовым путем к каталогу, который должны совместно использоваться всеми записями в архиве. Если любые две записи не начинаются с одного и того же шаблона, то они являются братьями и сестрами.
Первая строка в списке содержимого tar предоставит вам минимальный шаблон, который вы должны проверить. Это BASEPATH.
Затем, чтобы проверить наличие взрывоопасных тарболов, вам нужно проверить , не начинается ли какая-либо строка списка содержимого tar с BASEPATH.
Преврати это в функцию оболочки:
Отсюда вы можете написать безопасную функцию извлечения архива tar.
источник
aunpack archive.tar
это то, что я использую.Часть старого доброго пакета atool . Manpage: https://linux.die.net/man/1/atool
источник