我怎样才能从标准input生成一个焦油?

我怎样才能把信息input到指定文件名的tar

就像是:

 tar cfz foo.tgz -T - 

但请记住,这不适用于所有可能的文件名。 您应该考虑--null选项并从find -print0提供tar 。 ( xargs示例不适用于大型文件列表,因为它会生成多个tar命令。)

正如geekosaur已经指出的那样,没有必要将find的输出传递给xargs因为可以使用find ... -print0 | tar --null ...来直接将find ... -print0 | tar --null ...的输出传递给tar。-print0 find ... -print0 | tar --null ... find ... -print0 | tar --null ...

注意gnutarbsdtar在排除档案文件之间的细微差别。

 # exclude file.tar.gz anywhere in the directory tree to be tar'ed and compressed find . -print0 | gnutar --null --exclude="file.tar.gz" --no-recursion -czf file.tar.gz --files-from - find . -print0 | bsdtar --null --exclude="file.tar.gz" -n -czf file.tar.gz -T - # bsdtar excludes ./file.tar.gz in current directory by default # further file.tar.gz files in subdirectories will get included though # bsdtar: ./file.tar.gz: Can't add archive to itself find . -print0 | bsdtar --null -n -czf file.tar.gz -T - # gnutar does not exclude ./file.tar.gz in current directory by default find . -print0 | gnutar --null --no-recursion -czf file.tar.gz --files-from - 

扩展geekosaur的答案 :

 find /directory | tar -cf archive.tar -T - 

你可以使用stdin和-T选项。

请注意,如果使用某些条件(例如-name选项)过滤文件,则通常需要排除pipe道中的目录 ,否则tar将处理其所有内容,这不是您想要的。 所以,使用:

 find /directory -type f -name "mypattern" | tar -cf archive.tar -T - 

如果你不使用-type ,所有匹配"mypattern"的目录的内容都会被添加!

而不是使用pipe道,你可以使用反引号,例如:

 tar cvzf archive.tgz `ls -1 *` 

您可以将任何其他命令生成所需的归档文件列表,而不是ls -1 *

 find /directory > filename tar -T filename -cf archive.tar 

为了更好的压缩,使用bzip2可能会有所帮助。

 find $PWD -name "*.doc" > doc.filelist tar -cvjf jumbo.tar.bz2 -T doc.filelist 
Interesting Posts