tar 前导句号斜线

Ara*_*ram 5 tar

tar czf dist.tgz --exclude=".gitignore" 。

这会在 tar 中创建以“./”开头的文件,当服务器需要提取部分 tar 时,这会导致问题。

有人能告诉我如何打包它以便不会有前导“./”吗?

小智 9

尝试--xform使用类似 sed 的替换表达式的选项。这允许您更改进入存档的路径引用,而不是在提取期间处理它(例如使用 --strip-components)。

tar --exclude=.gitignore -cz --xform s:'./':: -f dist.tgz ./
Run Code Online (Sandbox Code Playgroud)

要在处理文件时列出文件,请添加-v--show-transformed-name选项:

tar --exclude=.gitignore -cvz --xform s:'./':: --show-transformed-name -f dist.tgz ./
Run Code Online (Sandbox Code Playgroud)

传递 --xform 的参数遵循以下结构:s/regexp/replace/[flags] 请注意,在我的示例中,我用作分隔符:;只要您始终如一地使用它,您就可以使用任何您想要的字符。很好的参考在这里

  • 如果您没有包含 `--xform` 的 tar,那么您可能会使用 `pax(1)` 命令,它具有类似的选项。 (2认同)

Mar*_* G. 5

有多种方法可以实现这一点,其中许多方法已经在这个问题中暗示过,其中一些还没有。这是我尝试将它们全部编译(附有参考资料)并展示示例以便于阅读,让读者可以选择适合他或她需要的一个。


示例输入树

这是将在以下示例中使用焦油的结构。

.dotfile
dir/
  .hidden
  file.txt
root.txt
Run Code Online (Sandbox Code Playgroud)

POSIX(跨平台、跨壳)解决方案

正如 Phil P.指出的那样,您可以使用pax而不是 tar 。

通常行为:

$ pax -wzvf ../ball.tar.gz .
[…]
$ pax -zf ../ball.tar.gz
.
./.dotfile
./dir
./dir/.hidden
./dir/file.txt
./root.txt
Run Code Online (Sandbox Code Playgroud)

没有点斜线:

$ pax -wzvf ../ball.tar.gz -s ':^\./::' .
[…]
$ pax -zf ../ball.tar.gz
.
.dotfile
dir
dir/.hidden
dir/file.txt
root.txt
Run Code Online (Sandbox Code Playgroud)

Shell Globbing(跨平台)解决方案

正如 ott指出的那样,您也可以使用*代替。这个解决方案基本上是 chutz's answer的简写形式,因为在将它们作为参数传递给程序之前,shell 会将下面示例中的星号扩展到所有非隐藏文件。.tar

没有点斜线(但请注意缺少的 root-level .dotfile):

$ tar -czvf ../ball.tar.gz *
[…]
$ tar -tzf ../ball.tar.gz
dir/
dir/.hidden
dir/file.txt
root.txt
Run Code Online (Sandbox Code Playgroud)

如果您不关心在 CWD 中打包点文件,那么您就大功告成了。

如果你真的关心,你不是没有追索权。在许多 shell(例如bash)上,可以通过更改 shell 选项在 shell glob 中包含点文件。使用 bash,这是通过shopt完成的:

点球

如果设置,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
Run Code Online (Sandbox Code Playgroud)

GNU (Linux) 解决方案

使用Jordan Bonitatis 的回答中提到的--xform

通常行为:

$ tar -czvf ../ball.tar.gz .
[…]
$ tar -tzf ../ball.tar.gz
./
./root.txt
./.dotfile
./dir/
./dir/file.txt
./dir/.hidden
Run Code Online (Sandbox Code Playgroud)

没有点斜线:

$ 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
Run Code Online (Sandbox Code Playgroud)

BSD (Mac OS X) 解决方案

使用-s,它看似与pax / sed相似,但不完全相似,如下所示。

通常行为:

$ tar -czvf ../ball.tar.gz .
[…]
$ tar -tzf ../ball.tar.gz
./
./.dotfile
./dir/
./root.txt
./dir/.hidden
./dir/file.txt
Run Code Online (Sandbox Code Playgroud)

没有点斜线:

$ 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
Run Code Online (Sandbox Code Playgroud)


chu*_*utz 2

不确定tar这是什么版本,但通常您必须指定要存档的文件。喜欢tar c .压缩本地目录中的所有内容。在我的机器上运行你的命令我得到:

tar: Cowardly refusing to create an empty archive
Run Code Online (Sandbox Code Playgroud)

所以,如果你不想得到前导./,也就是压缩本地目录时得到的.,你可以直接指定文件。例如:

> 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
Run Code Online (Sandbox Code Playgroud)