Архівація смоли, яка приймає дані зі списку файлів


166

У мене є файл, який містить список файлів, які я хочу архівувати за допомогою tar. Давайте назвемо цеmylist.txt

Це містить:

file1.txt
file2.txt
...
file10.txt

Чи є спосіб я видати команду TAR, яка приймає mylist.txtяк вхід? Щось на зразок

tar -cvf allfiles.tar -[someoption?] mylist.txt

Так що це схоже на те, що я видаю цю команду:

tar -cvf allfiles.tar file1.txt file2.txt file10.txt 

4
Сторінка tar tar надзвичайно не корисна для цієї опції (принаймні на RedHat 5.4 до 6.3): "-T: отримати імена для вилучення або створення з файлу F". "Витягнути або створити" звучить так, як це стосується вилучення файлів із архіву tar, але не введення їх. Параметр -Xвиключення зберігається від старої команди Unix tar, але, мабуть, -I (включати) не став!
Псалом Огре3333

Мало manсторінок із EXAMPLESрозділом, незважаючи на те, що це стандартний розділ . Див. < Unix.stackexchange.com/questions/306189/… >.
sam boosalis

Відповіді:


262

Так:

tar -cvf allfiles.tar -T mylist.txt

Я б хотів, щоб я міг помістити коментарі в mylist.txt .. чи є якесь вирішення, використовуючи якийсь варіант tar зсередини mylist.txt?
Стфан

7
@Stphane це просто, використання прапора --exclude дозволяє це. Якщо припустити, що рядки коментарів починаються з "#", така команда, як наведена нижче, буде ігнорувати / виключати будь-які спроби файлових операцій у рядках, що містять cmment, тобто ваша команда може виглядати так: tar -cvf allfiles.tar --exclude = '^ # '-T mylist.txt. Тар повідомляє про помилку, але при перевірці архіву дьогтю помилок немає, і всі файли зі списку знаходяться всередині вашого архіву.
Метт G

Вказуючи, що ця команда призначена для linux-варіанту, а для тих, хто працює на sunOS або інших варіантах, перегляньте інші відповіді нижче. Наприклад , для SunOS, дві альтернативи я випробувана: дьоготь -cvf file.tar -I list.txt і дьоготь -cvf file.tar $ (кіт list.txt)
Насрі Наджиб

-L mylist.txtв AIX
Роланд

82

Якщо припустити, що GNU tar (оскільки це Linux), -Tабо --files-fromваріант - це те, що ви хочете.


3
Цей варіант також існує у "bsdtar 3.1.2" на FreeBSD 10.
drue

33

Ви також можете вказати назви файлів, які можуть бути корисними:

find /path/to/files -name \*.txt | tar -cvf allfiles.tar -T -

2
Що робити, якщо список файлів .txt дійсно величезний? Чи слід використовувати команду xarg з tar -r .. замість tar -c ..?
Стфан

1
@Stphane Хм, я не думаю, що довжина списку має велике значення для цього методу. Насправді, я вважаю, що цей метод кращий за xargs, оскільки xargs буде повторювати тар знову і знову для додавання даних, але я не дуже перевіряв методи поряд.
woot

2
Коли використовується труба, що в цьому випадку, операційна система створює потоки по обидва боки труби та синхронізує виробництво та споживання даних. Список файлів може бути нескінченним. Ви можете націлити / gz весь Інтернет, використовуючи Raspberry Pi Zero, враховуючи, що у вас є достатньо місця на кінці труби.
Річард Гомес

14

Деякі версії tar, наприклад, версії за замовчуванням на HP-UX (я тестував 11.11 та 11.31), не містять опції командного рядка для визначення списку файлів, тому гідна обробка полягає в цьому:

tar cvf allfiles.tar $(cat mylist.txt)

4
UUoC (непотрібне використання cat), просто $(<mylist.txt).
Девід К. Ранкін

2
зауважте, що це може перевищувати максимальну довжину командного рядка, якщо mylist.txtвін великий
Андре Хольцнер

у такому випадку tar -T <(<mylist.txt). надмірна, як ця відповідь.
Майк Д

7

У програмі Solaris ви можете скористатися параметром -I, щоб прочитати файли, які ви зазвичай повідомляєте у командному рядку з файлу. На відміну від командного рядка, це може створити архіви tar з сотнями тисяч файлів (щойно це зробили).

Так би читався приклад

tar -cvf allfiles.tar -I mylist.txt

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