Видаліть файли з архіву tar


18

У мене великий файл, foo.tar.xzякий містить багато (скажімо, 200000) файлів. Я зрозумів, що цей архів містить кілька (близько 5000) файлів, які я не хочу. У мене немає достатнього місця на диску, щоб розпакувати всю річ на свій диск; крім того, я боюся, що атрибути / права можуть загубитися, якщо це зробити. У мене достатньо місця для розміщення двох примірників стислого архіву. Чи є інструмент для видалення деяких файлів з архіву (вказаних з допомогою регулярного вираження на ім'я файлу) на ходу, тобто без розпакування архіву в окремі файли?

Відповіді:


17

В GNU tar є --deleteможливість роботи з архівами і сьогодні.

Використовуйте його так, наприклад:

tar -vf yourArchive.tar --delete your/path/to/delete

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

Також робота в будь-якому випадку буде досить повільною, через (за задумом) лінійного характеру архівів дьогтю.


1
Він існує, але він не працює з файлами, де випадковий доступ неможливий (наприклад, стиснення архівів), але це мій варіант використання.
FUZxxl

1
Інша проблема полягає в тому, що я не можу вказати шаблон для видалення. Зверніть увагу на мій коментар від 2013 року, де я вже вирішую недоліки gtar --delete.
FUZxxl

4
@FUZxxl -Tпрацює з --deleteі --wildcardsдозволяє використовувати шаблони, а не назви файлів, тому створюйте тимчасовий файл, що містить шаблони та використовуйте unxz < file.tar.xz | tar --wildcards --delete -T patternfile | xz > file2.tar.xz. Він не виконає повний регулярний вираз (якщо вам це потрібно, просто скористайтеся tar -tі складіть список імен файлів, щоб видалити), а лише відповідні шаблони назви файлів.
Випадково832

14

(відредаговано, оскільки я неправильно зрозумів питання, яке було відредаговано також)

Найкраще, що ви можете зробити, - це витягнути, видалити та повторно видавити весь файл.

unxz < foobar-old.tar.xz | tar --delete foo/bar | xz > foobar-new.tar.xz

Видалити файли з тарінгу неможливо безпосередньо.

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

Якщо вам потрібна ця функціональність, смола, мабуть, не те, що ви хочете.


Ці файли становлять 35% розміру архівів. Обмеження, які ви вказуєте, начебто, застосовуються лише в тому випадку, коли я переписую файл, а не якщо я його модифікую поза місцем, що я можу зробити (у мене достатньо місця для збереження запакованого архіву двічі). Чи є такий інструмент?
FUZxxl

Я, можливо, неправильно зрозумів ваше запитання тоді. Якщо ви готові все-таки розпакувати дьоготь і перепакувати його (тільки не створюючи фактично файли, що містять таргування, тобто прямий тар до смоли), це можливо.
frostschutz

Так, я можу це зробити. Просто у файлах є uids / gids / атрибути, які мені потрібно зберегти. Крім того, мені не вистачає місця на диску, щоб зберегти розпаковане представлення. У мене є достатньо місця для збереження двох запакованих архівів.
FUZxxl

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

1
--wildcardsдопомога ... Мені довелося включити ./на початку шаблону ...
Герт ван ден Берг

-4

Відповідно до посібника , ви можете передати список імен, tarщоб лише їх витягнути. Наприклад:

$ tar --file archive.tar --list
foo
bar
baz

$ tar --file archive.tar --extract foo

Я не бачу, як - екстракт допомагає мені. Не могли б ви детальніше розробити? Майте на увазі, що я не можу розпакувати архів (або значну частину його) на диск.
FUZxxl

2
Будь ласка, не публікуйте лише посилання: це вікі - додайте достатній вміст, щоб люди не були потрібними залишати сторінку, щоб зрозуміти вашу відповідь.
jasonwryan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.