将目录打包成 tar,但不在存档中存储完整的绝对路径
- 2024-10-31 08:38:00
- admin 原创
- 39
问题描述:
我在备份 shell 脚本的一部分中有以下命令:
tar -cjf site1.bz2 /var/www/site1/
当我列出档案的内容时,我得到:
tar -tf site1.bz2
var/www/site1/style.css
var/www/site1/index.html
var/www/site1/page2.html
var/www/site1/page3.html
var/www/site1/images/img1.png
var/www/site1/images/img2.png
var/www/site1/subdir/index.html
但我想/var/www/site1
从存档中的目录和文件名中删除该部分,以简化提取并避免无用的常量目录结构。永远不知道,如果我将备份网站提取到没有存储网络数据的地方/var/www
。
对于上面的例子,我想要:
tar -tf site1.bz2
style.css
index.html
page2.html
page3.html
images/img1.png
images/img2.png
subdir/index.html
因此,当我提取时,文件会被提取到当前目录,之后我不需要在提取后移动文件,这样子目录结构就会被保留。
网络上和其他地方已经有很多关于 tar 和备份的问题stackoverflow
,但大多数都要求删除整个子目录结构(展平),或者只是在名称中添加或删除初始 /(我不知道在提取时它究竟发生了哪些变化),但仅此而已。
在阅读了这里和那里找到的一些解决方案以及手册后,我尝试:
tar -cjf site1.bz2 -C . /var/www/site1/
tar -cjf site1.bz2 -C / /var/www/site1/
tar -cjf site1.bz2 -C /var/www/site1/ /var/www/site1/
tar -cjf site1.bz2 --strip-components=3 /var/www/site1/
但它们都不能按照我想要的方式工作。有些什么都不做,有些则不再存档子目录。
它位于 Cron 启动的备份 shell 脚本中,所以我不知道哪个用户运行它,路径和当前目录是什么,所以总是需要为所有内容写绝对路径,并且不想更改当前目录以避免在脚本中进一步破坏某些内容(因为它不仅备份网站,还备份数据库,然后将所有这些发送到 FTP 等)
如何实现这一点?
我是否误解了选项 -C 的工作原理?
解决方案 1:
tar -cjf site1.tar.bz2 -C /var/www/site1 .
在上面的例子中,由于给出了/var/www/site1
选项,tar 将在执行其操作之前更改为目录。-C /var/www/site1
从man tar
:
OTHER OPTIONS
-C, --directory DIR
change to directory DIR
解决方案 2:
该选项-C
有效;为了说明起见,我将发布 2 个示例:
创建没有完整路径的 tarball:完整路径
/home/testuser/workspace/project/application.war
,我们想要的只是project/application.war
:
tar -cvf output_filename.tar -C /home/testuser/workspace project
workspace
注意:和之间有一个空格project
;tar 将用 替换完整路径project
。
提取 tarball 并改变目标路径(默认为
.
,即当前目录)
tar -xvf output_filename.tar -C /home/deploy/
tar
将根据给定的路径提取 tarball 并保留创建路径;在我们的示例中,文件application.war
将被提取到/home/deploy/project/application.war
。
/home/deploy
: 提取时给出
project
: 创建 tarball 时给出
注意:如果您想将创建的 tarball 放在目标目录中,只需在 tarball 名称前添加目标路径。例如:
tar -cvf /path/to/place/output_filename.tar -C /home/testuser/workspace project
解决方案 3:
似乎-C
tar v2.8.3 之前的选项在所有平台(操作系统)上都不能一致地工作。-C
该选项据说是将目录添加到存档中,但在 Mac 和 Ubuntu 上,它会在生成的 tar.gz 文件中添加绝对路径前缀。
tar target_path/file.tar.gz -C source_path/source_dir
因此,一致且强大的解决方案是cd
进入 source_path(source_dir 的父目录)并运行
tar target_path/file.tar.gz source_dir
或者
tar -cf target_path/file.tar.gz source_dir
在您的脚本中。这将删除生成的 tar.gz 文件的目录结构中的绝对路径前缀。
解决方案 4:
一个小细节:
tar -cjf site1.tar.bz2 -C /var/www/site1 .
添加文件为
tar -tf site1.tar.bz2
./style.css
./index.html
./page2.html
./page3.html
./images/img1.png
./images/img2.png
./subdir/index.html
如果你真的想要
tar -tf site1.tar.bz2
style.css
index.html
page2.html
page3.html
images/img1.png
images/img2.png
subdir/index.html
你应该
首先进入目录
或者运行
tar -cjf site1.tar.bz2 -C /var/www/site1 $(ls -A /var/www/site1)
但请注意,这不支持空格。感谢@dragon788 和@Fonic。
解决方案 5:
下面的命令将创建一个根目录“.”并将指定目录中的所有文件放入其中。
tar -cjf site1.tar.bz2 -C /var/www/site1 .
如果您想将所有文件放在 tar 文件的根目录中,@chinthaka 是对的。只需进入目录并执行以下操作:
tar -cjf target_path/file.tar.gz *
这会将 cwd 中的所有文件作为根文件放入 tar 文件中。
解决方案 6:
使用“point”将导致创建一个名为“point”的文件夹(在 Ubuntu 16 上)。
tar -tf site1.bz2 -C /var/www/site1/ .
我更详细地处理了这个问题,并准备了一个例子。多行记录,加上一个例外。
tar -tf site1.bz2\n -C /var/www/site1/ style.css\n -C /var/www/site1/ index.html\n -C /var/www/site1/ page2.html\n -C /var/www/site1/ page3.html\n --exclude=images/*.zip\n -C /var/www/site1/ images/
-C /var/www/site1/ subdir/
/
解决方案 7:
如果您想要存档子目录并修剪子目录路径,此命令将很有用:
tar -cjf site1.bz2 -C /var/www/ site1
解决方案 8:
tar -cjf site1.tar.bz2 -C /var/www/site1 --strip-components 1 .
这是之前所有响应的变体,生成具有以下内容的 tar:
style.css
index.html
page2.html
page3.html
images/img1.png
images/img2.png
subdir/index.html
在添加文件之前使用
-C
更改目录用于删除所有条目的
--strip-components 1
前导./
解决方案 9:
备份:
( cd $HOME/.config && tar -czvf "$HOME/Desktop/config.tar.gz" *)
我尝试了很多组合,包括-C <Source> .
。这个组合在开头添加/./
。只有上面给出的命令对我有用。
恢复:
tar -xzvf "$HOME/Desktop/config.tar.gz" -C "$HOME/.config/"
解决方案 10:
发现tar -cvf site1-$seqNumber.tar -C /var/www/ site1
比 tar -cvf site1-$seqNumber.tar -C /var/www/site1 .
(注意第二个解决方案中的.)更友好的解决方案,原因如下
Tar 文件名可能无关紧要,因为原始文件夹现在是一个存档条目
Tar 文件名对于内容来说并不重要,现在可以用于其他目的,如序列号、定期备份等。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件