如何将信息传递到指定文件名称的tar
?
答案 0 :(得分:91)
类似的东西:
tar cfz foo.tgz -T -
但请记住,这不适用于所有可能的文件名;您应该考虑--null
选项并从tar
提供find -print0
。 (xargs
示例不适用于大型文件列表,因为它会生成多个tar
命令。)
答案 1 :(得分:22)
正如geekosaur已经指出的那样,没有必要将find
的输出传递给xargs
,因为可以将find
的输出直接传递给tar
使用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 -
答案 2 :(得分:15)
find /directory | tar -cf archive.tar -T -
您可以将stdin与-T
选项一起使用。
请注意,如果您使用某些条件(例如-name
选项)过滤文件,则通常需要在管道中排除目录,否则tar将处理其所有内容,而不是你想要什么。所以,使用:
find /directory -type f -name "mypattern" | tar -cf archive.tar -T -
如果您不使用-type
,则会添加与"mypattern"
匹配的所有目录内容!
答案 3 :(得分:4)
您可以使用反引号代替使用管道,例如:
tar cvzf archive.tgz `ls -1 *`
而不是ls -1 *
,您可以放置任何其他命令来生成归档文件所需的列表
答案 4 :(得分:4)
find /directory > filename
tar -T filename -cf archive.tar
答案 5 :(得分:0)
为了更好的压缩,使用bzip2可能会有所帮助。
find $PWD -name "*.doc" > doc.filelist
tar -cvjf jumbo.tar.bz2 -T doc.filelist
答案 6 :(得分:0)
tar
计划已经以多种方式实施。例如,在IBM的Unix版本AIX上,tar
使用-L
选项而不是-T
,并且需要一个文件而不是-
来指示标准输入:
Usage: tar -{c|r|t|u|x} [ -BdDEFhilmopRUsvwZ ] [ -Number ] [ -f TarFil e ]
[ -b Blocks ] [ -S [ Feet ] | [ Feet@Density ] | [ Blocksb ] ]
[ -L InputList ] [-X ExcludeFile] [ -N Blocks ] [ -C Directory ] File ...
Usage: tar {c|r|t|u|x} [ bBdDEfFhilLXmNopRsSUvwZ[0-9] ] ]
[ Blocks ] [ TarFile ] [ InputList ] [ ExcludeFile ]
[ [ Feet ] | [ Feet@Density ] | [ Blocksb ] ] [-C Directory ] File ...