我有一个文件,其中包含我想用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
如果您不知道如何检查手册页:在命令行中,您可以键入man tar。 您可以使用箭头键PgUp和PgDn滚动手册,然后按q退出。 您还可以分别使用和?向前和向后搜索。
tar手册页对此选项非常无益(至少在RedHat 5.4至6.3中):" - T:从文件F中提取或创建名称"。"提取或创建"听起来像应用于从tar存档中取出文件,但不会将它们放入。-X exclude选项可以从旧的Unix tar命令中幸存下来,但显然-I(包含)没有!
尽管它是标准部分,但man部分的man页面很少。 请参阅。
是:
tar -cvf allfiles.tar -T mylist.txt
我希望我可以在mylist.txt中添加注释..是否有任何解决方法使用mylist.txt内部的一些tar选项?
@Stphane很简单,使用--exclude标志允许这样做。假设您的注释行以#开头,则以下命令将忽略/排除包含cmments的行上的任何尝试文件操作,即您的命令可能如下所示:tar -cvf allfiles.tar --exclude = ^#-T mylist.txt。 Tar报告错误,但是当您检查tar存档时,没有错误,列表中的所有文件都在您的存档中。
如果你想压缩这个坏男孩,请添加z。
指出此命令适用于linux变体以及sunOS或其他变体上的命令,请查看下面的其他答案。例如。对于sunOS,我测试了两种替代方法:tar -cvf file.tar -I list.txt和tar -cvf file.tar $(cat list.txt)
假设GNU tar(因为这是Linux),-T或--files-from选项就是你想要的。
此选项也存在于FreeBSD 10的"bsdtar 3.1.2"中。
您还可以输入可能有用的文件名:
find /path/to/files -name \*.txt | tar -cvf allfiles.tar -T -
如果.txt文件列表真的很大怎么办?应该使用xarg命令和tar -r ..而不是tar -c ..?
@Stphane嗯,我不认为列表的长度对这种方法很重要。事实上,我认为这种方法比xargs更好,因为xargs会反复重新运行tar来追加数据,但我并没有真正测试这些方法。
某些版本的tar(例如,HP-UX上的默认版本(我测试过11.11和11.31))不包含用于指定文件列表的命令行选项,因此一个体面的解决方法是执行此操作:
tar cvf allfiles.tar $(cat mylist.txt)
UUoC(不必要使用cat),只需$(。
请注意,如果mylist.txt很大,这可能会超出命令行的最大长度
在那种情况下tar -T 。像这个答案多余。
在Solaris上,您可以使用选项-I来读取通常在文件命令行中声明的文件名。 与命令行相比,这可以创建包含数十万个文件的tar存档(就是这样做)。
所以这个例子会读到
tar -cvf allfiles.tar -I mylist.txt
在AIX上对我来说,它的工作原理如下:
tar -L List.txt -cvf BKP.tar