Я хочу переглянути вміст націленого файлу, не виймаючи його, Сценарій: У мене є 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 )... і, звичайно, враховуючи також індивідуальний розмір кожного заголовка - що є додатковим блоком на одного члена. Таким чином, ви можете пропустити прочитане читання від заголовка до заголовка, поки ви не приземлитеся на одне, що відповідає заголовку, для якого ви шукаєте, і в цей час вам потрібно буде перевірити, чи лише поточний запис описує посилання на ваш файл або на фактичний файл . Це особливо актуально, оскільки коли один і той же файл додається до архіву кілька разів, багато tars включатимуть лише заголовки посилань, оскільки фактичні дані файлу вже можна знайти в іншому місці архіву.
Переконавшись, що вам потрібно буде застосувати свої обчислення до chksumполя та перевірити, наскільки ви думаєте, файл є насправді тим самим потрібним файлом. tar«S chksumдосить просто хотя-:
chksumПоле має бути ISO / IEC 646: стандартна IRV уявлення восьмеричного значення простої суми всіх октетів в заголовку логічного запису тисячі дев'ятсот дев'яносто один. Кожен октет у заголовку трактується як неподписане значення. Ці значення додаються до безпідписаного цілого числа, ініціалізованого до нуля, точність якого не менше 17 біт. Під час обчислення контрольної суми chksumполе обробляється так, ніби всі символи <пробіл> .Звичайно, ви насправді не повинні нічого цього робити, тому що tarвже можете це зробити - саме це і робиться - і тому, ймовірно, вам слід просто використовувати його для пошуку в архіві та витягування файлу для вас. При цьому він нічого не зробить зовсім інакше, ніж ви зробили б, якби ви знали, про що йдеться, за винятком того, що це, ймовірно, зробить це краще і швидше, тому що це його робота. І все одно, навіщо вам це робити?