我怎样才能从 stdin 构建焦油?

如何将信息导入指定文件名的 tar

112169 次浏览

不要使用管道,你可以使用反勾,例如:

tar cvzf archive.tgz `ls -1 *`

您可以放置任何其他命令来代替 ls -1 *,这些命令生成所需的归档文件列表

比如:

tar cfz foo.tgz --files-from=-

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

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

正如极客恐龙已经指出的那样,没有必要将 find的输出通过管道传送到 xargs,因为可以使用 find ... -print0 | tar --null ...find的输出直接传送到 tar

但是请注意 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 -

扩展 极客恐龙的回答:

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

可以将 stdin 与 -T选项一起使用。

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

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

如果不使用 -type,则将添加与 "mypattern"匹配的所有目录的内容!

tar项目已经以多种方式实施。例如,在 IBM 的 Unix 版本 AIX中,tar使用 -L选项而不是 -T,并且需要一个文件而不允许 -指示 stdin:

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 ...

你必须在 WINDOWS 上使用不同的方法。不要使用 z参数,因为它会导致 “无法自行添加存档”错误。此外,如果你不使用。在 Zip file name (当使用 z)参数中,tar.exe 将在 Zip 文件中创建一个无扩展的文件,这对于大多数人来说是没有用的。

而且,我认为大多数人想要一个包含文件的压缩文件,而不是一个包含 tar 的压缩文件。所以这也是不使用 z参数的一个原因。然而,我谈到在 Windows 中使用 tar,我不熟悉 Linux,可能它有所不同。因此,在 Windows 中:

若要在目录中创建 ZIP File,并在该目录中创建特定文件,请使用:

tar.exe -cf MyZipFilename.zip file1.txt file2.jpg file3.xyz

若要在目录中创建 ZIP File,并为该目录中的文件使用通配符,请使用:

tar.exe -cf MyZipFilename.zip *.txt *.jpg *.xyzff

要查看压缩文件,请在两者之间添加 v参数:

tar.exe -cvf MyZipFilename.zip file1.txt file2.jpg file3.xyz

或者

tar.exe -cvf MyZipFilename.zip *.txt *.jpg *.xyzff

若要在一个目录中创建 ZIP 文件(包含该目录中的所有文件) ,请使用: (诀窍在于-- 排除在开头)

tar.exe --exclude MyZipFilename.zip -cf MyZipFilename.zip *

最后,我不知道你为什么要使用它,但如果你想使用 z的命令将是:

tar.exe --exclude MyZipFilename.tar.zip -cvzf MyZipFilename.tar.zip *

试试吧