tar 前导句号斜线

tar 前导句号斜线

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)解决方案

您可以使用帕克斯而不是 tar,正如 Phil P.指出

常见行为:

$ 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 

曼塔尔

相关内容