Архивирование tar, которое принимает данные из списка файлов

167

У меня есть файл, содержащий список файлов, которые я хочу архивировать с помощью 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 
neversaint
источник
4
Страница man tar крайне бесполезна для этой опции (по крайней мере в RedHat с 5.4 по 6.3): «-T: получить имена для извлечения или создания из файла F». «Извлечение или создание» звучит так, как будто это относится к извлечению файлов из архива tar, но не к их вставке. Параметр -Xexclude сохраняется после старой команды tar Unix, но, очевидно, -I (include) этого не сделал!
Огрский псалом33
Есть несколько manстраниц с EXAMPLESразделом, несмотря на то, что это стандартный раздел . См. < Unix.stackexchange.com/questions/306189/… >.
Сам Boosalis

Ответы:

263

Да:

tar -cvf allfiles.tar -T mylist.txt
Мартин Йорк
источник
Я хотел бы поместить комментарии в mylist.txt .. есть ли обходной путь, используя какой-либо параметр tar из mylist.txt?
Стефан
7
@Stphane это просто, использование флага --exclude позволяет это. Предполагая, что строки комментариев начинаются с символа «#», команда, подобная следующей, будет игнорировать / исключать любые попытки файловых операций со строками, содержащими комментарии, т.е. ваша команда может выглядеть следующим образом: tar -cvf allfiles.tar --exclude = '^ # '-T mylist.txt. Tar сообщает об ошибке, но при проверке архива tar ошибок нет, и все файлы из списка находятся внутри вашего архива.
Мэтт G
Указывая, что эта команда для варианта linux и для тех, кто работает на sunOS или других вариантах, ознакомьтесь с другими ответами ниже. Например, для sunOS я протестировал две альтернативы: tar -cvf file.tar -I list.txt и tar -cvf file.tar $ (cat list.txt)
Насри Наджиб,
-L mylist.txtна AIX
Роланд
82

Предполагая GNU tar (так как это Linux), вам нужна опция -Tor --files-from.

Саймон Рихтер
источник
3
Эта опция также существует в "bsdtar 3.1.2" на FreeBSD 10.
drue
33

Вы также можете указать имена файлов, которые могут быть полезны:

find /path/to/files -name \*.txt | tar -cvf allfiles.tar -T -
Woot
источник
2
Что если список файлов .txt действительно огромный? Следует ли использовать команду xarg с tar -r .. вместо tar -c ..?
Стефан
1
@ Stphane Хм, я не думаю, что длина списка имеет большое значение для этого метода. На самом деле, я думаю, что этот метод лучше, чем xargs, так как xargs будет перезапускать tar снова и снова для добавления данных, но я не тестировал методы бок о бок.
woot
2
При использовании канала, как в данном случае, операционная система создает потоки по обе стороны канала и синхронизирует производство и потребление данных. Список файлов может быть бесконечным. Вы можете использовать tar / gz весь интернет, используя Raspberry Pi Zero, если у вас достаточно места на конце канала.
Ричард Гомес
14

Некоторые версии tar, например, версии по умолчанию в HP-UX (я тестировал 11.11 и 11.31), не включают параметр командной строки для указания списка файлов, поэтому неплохой способ это сделать:

tar cvf allfiles.tar $(cat mylist.txt)
barush
источник
4
UUoC (ненужное использование cat), просто $(<mylist.txt).
Дэвид С. Ранкин
2
обратите внимание, что это может превышать максимальную длину командной строки, если mylist.txtона велика
Андре Хольцнер
в таком случае tar -T <(<mylist.txt). лишний, как этот ответ.
Майк Д
7

В Solaris вы можете использовать опцию -I для чтения из файла имен файлов, которые вы обычно указали бы в командной строке. В отличие от командной строки, это может создавать tar-архивы с сотнями тысяч файлов (только что сделал).

Таким образом, пример будет читать

tar -cvf allfiles.tar -I mylist.txt
январь
источник
3

Для меня в AIX это работало следующим образом:

tar -L List.txt -cvf BKP.tar
Кассиано Буччи
источник