我怎样才能从标准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 ...
注意gnutar
和bsdtar
在排除档案文件之间的细微差别。
# 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