我如何从stdin建立一个tar?
我怎样才能将信息传输到指定文件名称的tar
?
就像是:
tar cfz foo.tgz -T -
但请记住,这不适用于所有可能的文件名; 您应该考虑--null
选项并从find -print0
提供tar
。 ( xargs
示例不适用于大型文件列表,因为它会生成多个tar
命令。)
正如已经指出的geekosaur,也没有必要管的输出find
到xargs
,因为它有可能管的输出find
直接tar
使用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
选项)过滤文件,则通常需要排除管道中的目录 ,否则tar将处理其所有内容,这不是您想要的。 所以,使用:
find /directory -type f -name "mypattern" | tar -cf archive.tar -T -
如果你不使用-type
,所有匹配"mypattern"
的目录内容将被添加!