Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 从文件列表中获取输入的Tar存档_Linux_Unix_Archive_Tar - Fatal编程技术网

Linux 从文件列表中获取输入的Tar存档

Linux 从文件列表中获取输入的Tar存档,linux,unix,archive,tar,Linux,Unix,Archive,Tar,我有一个包含我想用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 假设GNU tar(因为

我有一个包含我想用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 
假设GNU tar(因为这是Linux),您需要
-T
--files from
选项。

是:

tar -cvf allfiles.tar -T mylist.txt

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

下面的例子是

tar -cvf allfiles.tar -I mylist.txt

您还可以插入可能有用的文件名:

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

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

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

在AIX上,它的工作原理如下:

tar -L List.txt -cvf BKP.tar

tar手册页对于这个选项(至少在Redhat5.4到6.3版本中):“-T:获取要从文件F中提取或创建的名称”。“提取或创建”听起来似乎适用于将文件从tar归档中取出,但不将其放入。
-X
exclude选项从旧的Unix tar命令中保留下来,但显然-I(include)没有!很少有
man
页面包含
EXAMPLES
部分,尽管它是一个示例。请参阅。此选项也存在于FreeBSD 10上的“bsdtar 3.1.2”中。如果.txt文件列表非常大,该怎么办?应该将xarg命令与tar-r一起使用。。而不是焦油c@嗯,我不认为列表的长度对这个方法有多重要。事实上,我认为这种方法比xargs好,因为xargs会反复运行tar来追加数据,但我还没有真正测试过这些方法。当使用管道时,操作系统会在管道两侧创建流,并同步数据的产生和消耗。文件列表可能是无限的。您可以使用Raspberry Pi Zero对整个internet进行tar/gz,前提是管道末端有足够的存储空间。@Stpihane如果这样做,例如
find/path/to-name'*.txt'-exec tar-cvf all.tar{}\+
您会遇到麻烦,因为
find
会对连续的文件子集多次执行tar命令。只有最后一个子集会在存档中,因为它会为每个tar执行重新创建。我的一个与pigz一起使用的行程序:
find/path/to/files-name'*.log*.\tar-cvf--T-| pigz-9>logs.tgz
uooc(不必要地使用
cat
),只需
$(请注意,如果
mylist.txt
较大,这可能会超过命令行的最大长度。在这种情况下,
tar-T我希望我可以在mylist.txt中添加注释。是否有任何解决方法可以使用mylist.txt中的某个tar选项?@Stphane很简单,使用--exclude标志允许这样做。假设您的注释行以“#”开头,下面这样的命令将忽略/排除在包含cmments的行上尝试的任何文件操作,也就是说,您的命令可以如下所示:tar-cvf allfiles.tar--exclude='^#'-T mylist.txt.tar报告错误,但是当您检查tar存档时,没有错误,并且列表中的所有文件都在您的存档中。指出这个命令是针对linux变体的,对于sunOS或其他变体上的,请查看下面的其他答案。例如,对于sunOS,我测试过两个选项:tar-cvf file.tar-I list.txt和tar-cvf file.tar$(cat list.txt)
-L mylist.txt
,在AIXHow上如何进行tar而不包括完整路径?