tar czf dist.tgz --exclude=".gitignore" 。
这会在 tar 中创建以“./”开头的文件,当服务器需要提取 tar 的各部分时,这会导致问题。
有人能告诉我如何打包它以便不以“./”开头吗?
答案1
尝试--xform
使用类似 sed 的替换表达式的选项。这允许您更改进入存档的路径引用,而不是在提取期间处理它(例如使用 --strip-components)。
tar --exclude=.gitignore -cz --xform s:'./':: -f dist.tgz ./
要列出正在处理的文件,请添加-v
和--show-transformed-name
选项:
tar --exclude=.gitignore -cvz --xform s:'./':: --show-transformed-name -f dist.tgz ./
传递 --xform 的参数遵循以下结构:s/regexp/replace/[flags]
请注意,在我的示例中,我用作:
分隔符;您可以使用任何您想要的字符,只要您始终如一地使用它即可。很好的参考这里。
答案2
实现这一点的方法有很多,其中许多方法已经在本问题中提到过,有些则没有。我尝试将它们全部汇编起来(附有参考资料)并展示示例以方便阅读,让读者挑选一种适合自己需要的方法。
输入树示例
这是将在以下示例中讨论的结构。
.dotfile
dir/
.hidden
file.txt
root.txt
POSIX(跨平台、跨 Shell)解决方案
常见行为:
$ pax -wzvf ../ball.tar.gz .
[…]
$ pax -zf ../ball.tar.gz
.
./.dotfile
./dir
./dir/.hidden
./dir/file.txt
./root.txt
没有点斜线:
$ pax -wzvf ../ball.tar.gz -s ':^\./::' .
[…]
$ pax -zf ../ball.tar.gz
.
.dotfile
dir
dir/.hidden
dir/file.txt
root.txt
Shell 通配符(跨平台)解决方案
您也可以使用*
而不是.
,如 ott--指出。这个解决方案基本上是 chutz 的简写形式回答,因为 shell 会将下面示例中的星号扩展为所有非隐藏文件,然后将它们作为参数传递给程序tar
。
没有点斜线(但请注意缺少根级别.dotfile
):
$ tar -czvf ../ball.tar.gz *
[…]
$ tar -tzf ../ball.tar.gz
dir/
dir/.hidden
dir/file.txt
root.txt
如果您不关心在 CWD 中打包点文件,那么您就完成了。
如果你做小心,你不是没有办法的。在许多 shell 上(例如bash
),可以通过更改 shell 选项将点文件包含在 shell glob 中。对于 bash,可以使用购物:
点团
如果设置,狂欢在路径名扩展的结果中包含以“.”开头的文件名。
$ shopt -s dotglob # Include dot-files in pathname expansions
$ tar -czvf ../ball.tar.gz *
[…]
$ shopt -u dotglob # Restore shell's default globbing behavior
$ tar -tzf ../ball.tar.gz
.dotfile
dir/
dir/.hidden
dir/file.txt
root.txt
GNU(Linux)解决方案
使用--xform正如 Jordan Bonitatis 所提到的回答。
常见行为:
$ tar -czvf ../ball.tar.gz .
[…]
$ tar -tzf ../ball.tar.gz
./
./root.txt
./.dotfile
./dir/
./dir/file.txt
./dir/.hidden
没有点斜线:
$ tar -czvf ../ball.tar.gz --xform 's:^\./::' . [--show-transformed-names|--show-stored-names]
[…]
$ tar -tzf ../ball.tar.gz
./
root.txt
.dotfile
dir/
dir/file.txt
dir/.hidden
BSD(Mac OS X)解决方案
使用-s,这看起来类似于帕克斯/sed,但不完全是,如下所示。
常见行为:
$ tar -czvf ../ball.tar.gz .
[…]
$ tar -tzf ../ball.tar.gz
./
./.dotfile
./dir/
./root.txt
./dir/.hidden
./dir/file.txt
没有点斜线:
$ tar -czvf ../ball.tar.gz -s '/.//' .
tar: Removing leading '/' from member names
[…]
$ tar -tzf ../ball.tar.gz
.dotfile
dir/
root.txt
dir/.hidden
dir/file.txt
答案3
不确定tar
这是哪个版本,但通常你必须指定要存档的文件。比如tar c .
压缩本地目录中的所有内容。在我的计算机上运行你的命令,我得到:
tar: Cowardly refusing to create an empty archive
因此,如果您不想获取前导./
(即压缩本地目录时所得到的 ).
,您可以直接指定文件。例如:
> tar c hosts fstab | tar tv
-rw-r--r-- root/root 1225 2012-10-20 13:37 hosts
-rw-r--r-- root/root 678 2012-05-13 22:09 fstab
答案4
我已经习惯tar -P
保留前导/
(而不是./
)但目前还不完全清楚这是否会对你的情况有帮助。
-P, --absolute-names
don't strip leading '/'s from file names