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]
请注意,在我的示例中,我用作分隔符:
;只要您始终如一地使用它,您就可以使用任何您想要的字符。很好的参考在这里。
有多种方法可以实现这一点,其中许多方法已经在这个问题中暗示过,其中一些还没有。这是我尝试将它们全部编译(附有参考资料)并展示示例以便于阅读,让读者可以选择适合他或她需要的一个。
示例输入树
这是将在以下示例中使用焦油的结构。
.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)
不确定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)
归档时间: |
|
查看次数: |
7526 次 |
最近记录: |