RAR 在压缩包中使用相对路径 (Linux版)

缘起:我需要备份博客源文件
我想把我的博客(以下简称 本博 )的源文件打包压缩备份到本地。
所以,我在 Linux (此处以 Kali Linux 为例)下安装了 rar。
1 | |
用 rar 将博客源文件所在的目录 ~/kukmoon_blog 打包[1]。
1 | |
但是,我发现,rar 把绝对路径也放进了压缩包。这个压缩包打开以后,上来第一层是 home 目录,第二层是 Kukmoon 目录,第三层是 kukmoon_blog 目录,到第四层才是所有的博客源文件。

**怎样才能让 rar.exe 在压缩包里使用相对路径呢?**我的要求是,打开压缩包,第一层就是 kukmoon_blog 目录。

rar 的 -ep1 开关
经过摸索,我在 rar 控制台版本的用户手册[2]里找到了一个 -ep1 开关。这个开关可以在压缩包内去掉上一层目录,相当于使用相对路径,可搭配 rar 的 a 和 u 命令使用。
官方对这个开关的解释是:
1 | |
例题精讲
下面我们用四道例题来解释 -ep1 参数的用法。
假设:在 ~/abc/def 目录下有个 1.txt 文件,有个 ghi 子目录,在这个子目录下有 2.txt 文件。
1 | |
【例 1】
执行命令:
1 | |
生成的 example1.rar 的内部结构是:
1 | |
显然,如果不使用 -ep1参数,并且压缩文件里包含了每个文件和目录的全部路径,从根目录开始算。
【例 2】
执行命令:
1 | |
生成的 example2.rar 的内部结构是:
1 | |
例 2 和例 1 的区别在于,例 2 在输入列表文件(即待压缩的文件)的路径时,在 def 后面多加了一个反斜杠。加这个反斜杠的目的的指明 def 不是文件,而是子目录。
但是,生成的 example1.rar 和 examle2.rar 没有区别。
这说明,如果不加 -ep1 开关,那么在子目录的名称后面加不加斜杠,没有区别。
【例 3】
执行命令:
1 | |
生成的 example3.rar 的内部结构是:
1 | |
例 3 和例 1 的区别在于,例 3 加入了 -ep1 开关。结果就是,abc 目录从压缩包里消失了,压缩包第一层文件结构是原来的 abc 目录里的 def 子目录。
为什么呢?
官方对这个 -ep1 参数的解释有一句话:
Exclude base dir from names.
其中,base dir 是上一层目录,例如,~/abc/def/1.txt 的 base dir 是 ``~/abc/def/` 目录。
所以,例 3 这条命令 rar a -r -ep1 example3.rar ~/abc/def 的作用是,从压缩包里排除 ~/abc 这个路径,压缩包的第一层结构是 def 子目录。
注意:如果在 ~/abc 目录中还有其它文件或子目录,rar 也会一起把它们排除,只保留 def 子目录。
【例 4】
执行命令:
1 | |
生成的 example4.rar 的内部结构是:
1 | |
例 4 和 例 3 的区别是,例 4 在输入列表文件(即待压缩的文件)的路径时,在 def 后面多加了一个反斜杠。加这个反斜杠的目的的指明 def 不是文件,而是子目录。
结果是,exampl4.rar 不但排除了 abc 目录,连 def 目录也排除了。上来第一层目录结构是原来 def 目录中的 1.txt 和 ghi 子目录。
这是为什么呢?
计算机基础知识告诉我们,目录也是个特殊的文件,需要在目录名后面加个斜杠(Unix-like 操作系统要求用正斜杠,DOS/Windows 要求用反斜杠)作为标记。
如果不加斜杠,大多数情况下,系统会自动区分,但是个别情况下,区分无效,用户需要强行用斜杠表示区分。
这就属于那种需要用户自己加斜杠来区分的类型:
- 如果不加斜杠,比如
~/abc/def,系统把def当作文件名而不是目录名,所以,base dir 是~/abc/目录。 - 如果加了斜杠,比如
~/abc/def/,系统把def/当作目录名,那么 base dir 就是~/abc/def/目录。
我甚至怀疑,rar.exe 的源代码是这么写的:从右向左寻找第一个斜杠,把第一个斜杠左边的字符串作为 base dir,从而把它对应的目录路径从压缩包里排除出去。
【例 5】
执行命令:
1 | |
生成的 example5.rar 的内部结构,与 example4.rar 一样:
1 | |
注意事项
-
无论是不是加
-ep1开关,rar都会把~、~/abc目录中的其它内容(包括文件、子目录、子目录中的文件)排除掉,只保留~/abc/def/目录下的内容。 -
7z默认排除 base dir,不用问 7z 用什么开关才能排除 base dir。
图片版权
头图:Banner Image by milkusmaximus from Pixabay
参考文献
