Tar存档,可从文件列表中获取输入


166

我有一个包含要使用tar存档的文件列表的文件。叫它吧mylist.txt

它包含了:

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

有没有一种方法可以发出将mylist.txt输入作为输入的TAR命令?就像是

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

这样就好像我发出以下命令一样:

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

4
tar手册页对于此选项(至少在RedHat 5.4到6.3上)极为无助:“ -T:获取要从文件F中提取或创建的名称”。“提取或创建”听起来像适用于将文件从tar存档中取出,而不是放入文件中-X。exclude选项在旧的Unix tar命令中仍然存在,但是-I(包括)显然没有!
Ogre Psalm33 2013年

尽管man页面EXAMPLES标准部分,但很少有页面带有部分。请参阅< unix.stackexchange.com/questions/306189/… >。
sam boosalis,

Answers:


262

是:

tar -cvf allfiles.tar -T mylist.txt

我希望我可以在mylist.txt中添加评论。.是否有任何变通办法,可以使用mylist.txt内部的某些tar选项?
斯特凡

7
@Stphane很简单,使用--exclude标志可以实现这一点。假设您的注释行以“#”开头,​​则以下命令将忽略/排除包含cmments的行上的任何文件尝试操作,即您的命令应如下所示:tar -cvf allfiles.tar --exclude ='^ #'-T mylist.txt。Tar报告错误,但是当您检查tar存档时,没有错误,并且列表中的所有文件都在存档中。
Matt G

指出此命令适用于linux变体以及sunOS或其他变体上的命令,请检查以下其他答案。例如,对于sunOS,我测试了两个替代方案:tar -cvf file.tar -I list.txt和tar -cvf file.tar $(cat list.txt)
Nasri Najib

-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 -

2
如果.txt文件列表确实很大,该怎么办?应该将xarg命令与tar -r ..而不是tar -c ..一起使用吗?
斯特凡2015年

1
@Stphane Hmm,我认为此方法列表的长度并不重要。实际上,我想这种方法比xargs更好,因为xargs会反复运行tar来追加数据,但是我并没有真正测试过这些方法。
2016年

2
使用管道时(在这种情况下),操作系统将在管道的两侧创建流并同步数据的产生和消耗。文件列表可以是无限的。考虑到管道末端有足够的存储空间,您可以使用Raspberry Pi Zero压缩/压缩整个互联网。
理查德·戈麦斯

14

某些版本的tar(例如,HP-UX上的默认版本(我测试了11.11和11.31))不包含用于指定文件列表的命令行选项,因此,一种不错的解决方法是:

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

4
UUoC(不必要的使用cat),简单来说$(<mylist.txt)
David C. Rankin

2
请注意,如果mylist.txt很大,则可能会超过命令行的最大长度
Andre Holzner

在那种情况下tar -T <(<mylist.txt)。像这样的答案多余。
Mike D

7

在Solaris上,可以使用-I选项从文件中读取通常在命令行上指定的文件名。与命令行相反,这可以创建包含数十万个文件的tar归档文件(只是这样做了)。

所以该示例将读取

tar -cvf allfiles.tar -I mylist.txt

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.