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

nev*_*int 146 unix linux tar archive

我有一个文件,其中包含我想用tar存档的文件列表.我们称之为mylist.txt

它包含:

file1.txt
file2.txt
...
file10.txt
Run Code Online (Sandbox Code Playgroud)

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

tar -cvf allfiles.tar -[someoption?] mylist.txt
Run Code Online (Sandbox Code Playgroud)

所以它就像我发出这个命令一样:

tar -cvf allfiles.tar file1.txt file2.txt file10.txt 
Run Code Online (Sandbox Code Playgroud)

Mar*_*ork 231

是:

tar -cvf allfiles.tar -T mylist.txt
Run Code Online (Sandbox Code Playgroud)

  • @Stphane这很简单,使用--exclude标志允许这样做.假设您的注释行以"#"开头,​​则以下命令将忽略/排除包含cmments的行上的任何尝试文件操作,即您的命令可能如下所示:tar -cvf allfiles.tar --exclude ='^ #'-T mylist.txt.Tar报告错误,但是当您检查tar存档时,没有错误,列表中的所有文件都在您的存档中. (5认同)
  • AIX 上的“-L mylist.txt” (2认同)

Sim*_*ter 81

假设GNU tar(因为这是Linux),-T或者--files-from选项就是你想要的.

  • 此选项也存在于FreeBSD 10的"bsdtar 3.1.2"中. (3认同)

woo*_*oot 28

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

find /path/to/files -name \*.txt | tar -cvf allfiles.tar -T -
Run Code Online (Sandbox Code Playgroud)

  • 当使用管道时(就是这里的情况),操作系统在管道的两侧创建流并同步数据的生产和消费。文件列表可能是无限的。如果管道末端有足够的存储空间,您可以使用 Raspberry Pi Zero 来 tar/gz 整个互联网。 (4认同)
  • @Stphane 嗯,我认为列表的长度对于这个方法来说并不重要。事实上,我认为这种方法比 xargs 更好,因为 xargs 会一遍又一遍地重新运行 tar 来附加数据,但我还没有真正并排测试这些方法。 (3认同)
  • 如果 .txt 文件列表真的很大怎么办?应该将 xarg 命令与 tar -r.. 一起使用,而不是 tar -c.. 吗? (2认同)

bar*_*ush 13

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

tar cvf allfiles.tar $(cat mylist.txt)
Run Code Online (Sandbox Code Playgroud)

  • *UUoC*(不必使用`cat`),只需`$(<mylist.txt)`. (4认同)
  • 请注意,如果“ mylist.txt”较大,则该长度可能会超过命令行的最大长度。 (2认同)

Jan*_*Jan 7

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

所以这个例子就是这样的

tar -cvf allfiles.tar -I mylist.txt
Run Code Online (Sandbox Code Playgroud)


小智 7

对于 AIX 上的我来说,它的工作原理如下:

tar -L List.txt -cvf BKP.tar
Run Code Online (Sandbox Code Playgroud)

  • 在基于 debian 的选项是“-T, --files-from=FILE”。 (3认同)