Я хочу переглянути вміст націленого файлу, не виймаючи його, Сценарій: У мене є a.tar, а всередині є файл, який називається ./x/y.txt
. Я хочу переглянути вміст y.txt
без фактичного вилучення a.tar
.
Я хочу переглянути вміст націленого файлу, не виймаючи його, Сценарій: У мене є a.tar, а всередині є файл, який називається ./x/y.txt
. Я хочу переглянути вміст y.txt
без фактичного вилучення a.tar
.
Відповіді:
Це, мабуть, специфічний для 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
$ tar -axf file.tgz foo/bar -O
Це друкує вміст ./x/y.txt з a.tar в STDOUT.
tar xfO a.tar ./x/y.txt
Це просто так
less a.tar:./x/y.txt
Цей магічний трюк працює, якщо ви lesspipe
встановили, і якщо визначена змінна env LESSOPEN
така, | /usr/bin/lesspipe.sh %s
яка очікується, якщо у вас встановлена менша труба правильно.
lesspipe.sh
мабуть, слід віддати перевагу.
О, але це питання про вміст файлу у 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
поле інтерпретується так, як описано під визначенням цього типу запису.typeflag
поля встановлено 3 ( спеціальний файл символів ) , 4 ( спеціальний файл блоку ) або 6 ( FIFO ) , значення size
поля не визначено цим томом POSIX.1-2008, і ніяких логічних записів даних не повинно бути зберігається на носії.size
поле повинно ігноруватися при читанні.typeflag
поля встановлено будь-яке інше значення, кількість логічних записів, записаних за заголовком, має бути , ігноруючи будь-який дріб у результаті поділу.( (
size
+ 511 ) / 512 )
... і, звичайно, враховуючи також індивідуальний розмір кожного заголовка - що є додатковим блоком на одного члена. Таким чином, ви можете пропустити прочитане читання від заголовка до заголовка, поки ви не приземлитеся на одне, що відповідає заголовку, для якого ви шукаєте, і в цей час вам потрібно буде перевірити, чи лише поточний запис описує посилання на ваш файл або на фактичний файл . Це особливо актуально, оскільки коли один і той же файл додається до архіву кілька разів, багато tar
s включатимуть лише заголовки посилань, оскільки фактичні дані файлу вже можна знайти в іншому місці архіву.
Переконавшись, що вам потрібно буде застосувати свої обчислення до chksum
поля та перевірити, наскільки ви думаєте, файл є насправді тим самим потрібним файлом. tar
«S chksum
досить просто хотя-:
chksum
Поле має бути ISO / IEC 646: стандартна IRV уявлення восьмеричного значення простої суми всіх октетів в заголовку логічного запису тисячі дев'ятсот дев'яносто один. Кожен октет у заголовку трактується як неподписане значення. Ці значення додаються до безпідписаного цілого числа, ініціалізованого до нуля, точність якого не менше 17 біт. Під час обчислення контрольної суми chksum
поле обробляється так, ніби всі символи <пробіл> .Звичайно, ви насправді не повинні нічого цього робити, тому що tar
вже можете це зробити - саме це і робиться - і тому, ймовірно, вам слід просто використовувати його для пошуку в архіві та витягування файлу для вас. При цьому він нічого не зробить зовсім інакше, ніж ви зробили б, якби ви знали, про що йдеться, за винятком того, що це, ймовірно, зробить це краще і швидше, тому що це його робота. І все одно, навіщо вам це робити?