Перегляд файлу в архіві смоли, не витягаючи його


16

Я хочу переглянути вміст націленого файлу, не виймаючи його, Сценарій: У мене є a.tar, а всередині є файл, який називається ./x/y.txt. Я хочу переглянути вміст y.txtбез фактичного вилучення a.tar.


Якщо ви використовуєте Emacs, ви можете просто відкрити в ньому тарбол.
Кудит

Ер, щоб переглянути його, ви повинні його витягти. Я гадаю, що ви маєте на увазі "не записуючи його у файл"?
Toby Speight

Відповіді:


20

Це, мабуть, специфічний для GNU варіант, але ви можете використовувати -Oабо --to-stdoutдля вилучення файлів до стандартного виводу

$ tar -axf file.tgz foo/bar -O

Ах працює, але мені не вдалося надрукувати вихід на нових рядках. екс; tar -axf file.tar.gz --wildcards --no-anchored '*read_this_file*' --Oколи, наприклад, багато файлів збігаються *read_this_file*. Все друкується в одному рядку. З man, я знайшов --to-command. тому Passing --to-command="echo '' && cat"- це трохи чорна магія, але вона працює: D
GabLeRoux

Просто це потрібно у відповідь:$ tar -axf file.tgz foo/bar -O
user1742529


4

Це просто так

less  a.tar:./x/y.txt

Цей магічний трюк працює, якщо ви lesspipeвстановили, і якщо визначена змінна env LESSOPENтака, | /usr/bin/lesspipe.sh %sяка очікується, якщо у вас встановлена менша труба правильно.


Це дивовижний сценарій - але їх існує більше. Як я розумію, цьому,lesspipe.sh мабуть, слід віддати перевагу.
mikeserv

Чи буде це працювати на стиснених тарболах?
terdon

Це повинно. Але я просто виявив, що це не працює в ubuntu. Піди розберися. Вони порушили або видалили функцію. Ви все ще можете переглядати архівний список із меншим вмістом файлів, але не ним :-(
solsTiCe

2

О, але це питання про вміст файлу у tarфайлі. А насправді в деяких випадках це не так складно. Річ у тім, що tarфайл - це лише заблокований файл потокового потоку - кожен файл в архіві знаходиться після того, як той, який знаходиться перед ним, і кожен файл отримує заголовок метаданих на основі визначеного формату .

Виходячи з цього формату, я одного разу писав shitar- це було декілька рядків ddта сценаріїв оболонки, які могли tarпідняти потік блокових пристроїв на ходу. На основі того ж, нещодавно я написав ці кілька рядків коду :

tar --no-recursion -c ./      |
{ printf \\0; tr -s \\0; }    |
cut -d '' -f-2,13             |
tr '\0\n' '\n\t'

... для вибору tarфайлу на льоту і виконання вбудованих перетворень на його компонентних текстових файлах. Там cutполя вказують на поля 1,2,13 відмежованого NUL рядка введення. Такі речі прості, коли tarфайл містить лише текстові файли, тому tarщо обмежувачі записів (як це може траплятися раз на 512 байт) можна просто стиснути до одного NUL на кожну та зняти - не вимагаючи від вас рахувати події, як ви це робите.

tarФормат заголовка виглядає приблизно так:

field    offset   len
name     0        100
mode     100      8
uid      108      8
gid      116      8
size     124      12
mtime    136      12
chksum   148      8
typeflag 156      1
linkname 157      100
magic    257      6
version  263      2
uname    265      32
gname    297      32
devmajor 329      8
devminor 337      8
prefix   345      155

Зрозумійте, що існує відносна простота між простими керуванням простими tarопераціями із значно складнішими аспектами формату архіву. Хоча прості речі, такі як упаковка невеликої групи однорідно набраних файлів разом або навіть розбиття архіву, що містить лише членів, типи яких можна передбачити, - можна легко виконати за допомогою декількох оболонок, надійно обробляти довільні члени архіву - це не дрібниця.

Особливо складно, коли ці члени можуть містити довільні двійкові дані - що, безумовно, перешкоджає будь-якому надійному застосуванню, tr -s- і ця складність полягає лише в тому, що використовуються файли різного типу, крім звичайних та / або діаграм, окрім рідного, та / або оригінальний архів був створений за допомогою програми з форматними ідіосинкразіями, з якими ви не готові працювати. І це стосується лише основних, стандартизованих аспектів типу tarархіву - додайте розширені заголовки та розширення форматів, розріджені файли та стиснення та ... ну, удачі з ними.

Повернення до основ, однак, стандартний розмір запису для tarархіву становить 20 блоків - або 10240 байт. Зважаючи на те, що архів заблокований у стандартному розмірі запису та містить лише стандартні типи файлів та стандартні ustarзаголовки, однак слід переходити з заголовка члена до заголовка члена, виконуючи читання відповідно до sizeполя заголовка, поки не знайдеться член, що відповідає одному для яких ви прагнете. Потрапивши туди, читайте в sizeбайтах із зміщенням, починаючи з хвоста заголовка учасника цілі. І це ваш файл.

Однак пропустити заголовки не дуже просто. До різних типів або не будуть додані фактичні блоки даних, які відповідають size. Наприклад, каталоги та посилання не містять такого блоку даних, лише опис заголовка, і тому ви повинні бути готові перевірити тип файлу поточного заголовка, перш ніж з’ясувати, чи слід застосовувати його sizeполе до пропускної формули чи ні.

Також коефіцієнти розміру запису - залежно від того, чи розміри членів архіву добре синхронізуються зі стандартним розміром 10240 стандартного запису, може бути, а може і не бути додатковим 0-блоком, доданим до кожного. І розмір запису може бути оголошений під час створення архіву - і тому він може взагалі не бути 20 блоків, хоча, за специфікацією, він завжди повинен бути заблокований на 512-байтових одиницях:

  • устар
    • Формат tarобміну; див. Розширений опис . За замовчуванням розмір блоку для цього формату для спеціальних архівів символів повинен становити 10240 . Реалізація повинна підтримувати всі величини блоку, менші або рівні 32256 , кратні 512 .

Отже, якщо ви працювали з tarфайлом, який може містити файли, які можуть містити довільні двійкові дані, вам доведеться пропустити файл алгоритмічно та відповідно до типу файлу. Специфікація говорить:

  • sizeПоле розмір файлу в октетах.
    • Якщо typeflagполе встановлено, щоб вказати файл типу 1 ( посилання ) або 2 ( символічне посилання ) , sizeполе вказується як нуль.
    • Якщо typeflagполе встановлено, щоб вказати файл типу 5 ( каталог ) , sizeполе інтерпретується так, як описано під визначенням цього типу запису.
    • Логічні записи даних не зберігаються для типів 1 , 2 або 5 .
    • Якщо для typeflagполя встановлено 3 ( спеціальний файл символів ) , 4 ( спеціальний файл блоку ) або 6 ( FIFO ) , значення sizeполя не визначено цим томом POSIX.1-2008, і ніяких логічних записів даних не повинно бути зберігається на носії.
    • Крім того, для типу 6 , то sizeполе повинно ігноруватися при читанні.
  • Якщо для typeflagполя встановлено будь-яке інше значення, кількість логічних записів, записаних за заголовком, має бути , ігноруючи будь-який дріб у результаті поділу.( (size+ 511 ) / 512 )

... і, звичайно, враховуючи також індивідуальний розмір кожного заголовка - що є додатковим блоком на одного члена. Таким чином, ви можете пропустити прочитане читання від заголовка до заголовка, поки ви не приземлитеся на одне, що відповідає заголовку, для якого ви шукаєте, і в цей час вам потрібно буде перевірити, чи лише поточний запис описує посилання на ваш файл або на фактичний файл . Це особливо актуально, оскільки коли один і той же файл додається до архіву кілька разів, багато tars включатимуть лише заголовки посилань, оскільки фактичні дані файлу вже можна знайти в іншому місці архіву.

Переконавшись, що вам потрібно буде застосувати свої обчислення до chksumполя та перевірити, наскільки ви думаєте, файл є насправді тим самим потрібним файлом. tar«S chksumдосить просто хотя-:

  • cksum
    • chksumПоле має бути ISO / IEC 646: стандартна IRV уявлення восьмеричного значення простої суми всіх октетів в заголовку логічного запису тисячі дев'ятсот дев'яносто один. Кожен октет у заголовку трактується як неподписане значення. Ці значення додаються до безпідписаного цілого числа, ініціалізованого до нуля, точність якого не менше 17 біт. Під час обчислення контрольної суми chksumполе обробляється так, ніби всі символи <пробіл> .

Звичайно, ви насправді не повинні нічого цього робити, тому що tarвже можете це зробити - саме це і робиться - і тому, ймовірно, вам слід просто використовувати його для пошуку в архіві та витягування файлу для вас. При цьому він нічого не зробить зовсім інакше, ніж ви зробили б, якби ви знали, про що йдеться, за винятком того, що це, ймовірно, зробить це краще і швидше, тому що це його робота. І все одно, навіщо вам це робити?


0

Ви можете використовувати цей рядок

tar -axf a.tar -O

3
Це покаже будь-який файл, який є в tar, не просто, y.txtі з питання ОП не зрозуміло, що це єдиний файл у tar.
Антон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.