![Tar 忽略 --directory 选项](https://linux22.com/image/135225/Tar%20%E5%BF%BD%E7%95%A5%20--directory%20%E9%80%89%E9%A1%B9.png)
我正在尝试获取一个目录并从另一个位置在我的主目录中创建它的存档。我知道该-C
选项可以用于此目的,但tar
似乎忽略了它。我已经尝试过我要存档的目录的路径在$(basename $DEST)_$(date +%F_%H%M%S).tar.gz -C $HOME $(basename $DEST)
哪里。 $DEST
tar 没有在我的主目录中创建存档,而是继续在我执行它的目录中创建它。我执行 tar 的方式有问题吗?其他一切似乎都工作正常,只是该-C
标志被完全忽略了。我使用的是 Linux Mint 18.3 XFCE 版本。
编辑:完整的命令是tar czf Pictures_$CREATION_TIMESTAMP.tar.gz -C /home/$USER Pictures
.我是从 执行它的/home/$USER/coding/python_code/
。
答案1
-C
不影响存档的创建位置。它仅影响将哪些文件添加到存档中。因此,例如,给定tar cvf foo.tar a -C /b c -C /d e
,将从当前目录tar
添加,切换到并添加,切换到并添加。其本身将在当前目录(原来的目录)中创建。a
/b
c
/d
e
foo.tar
a
如果命令行上没有给出用于添加的文件,但-C /some/dir
使用了,tar
则将切换到/some/dir
并将其中的所有内容添加到存档中。
(相应地,解压时,-C
不会影响在哪里tar
查找存档文件。它只会影响解压后的文件的去向。)
因此:tar czf Pictures_$CREATION_TIMESTAMP.tar.gz -C /home/$USER Pictures
from/home/$USER/coding/python_code/
将始终在 中创建存档/home/$USER/coding/python_code/
,目录为Pictures
from /home/$USER
。
如果您想要在 中创建的存档中Pictures
的目录,则必须创建存档:/home/$USER
/home/$USER
cd
/home/$USER
cd "/home/$USER"; tar czf "Pictures_$CREATION_TIMESTAMP.tar.gz" Pictures
或者,指定存档的路径:
tar czf "/home/$USER/Pictures_$CREATION_TIMESTAMP.tar.gz" -C "/home/$USER" Pictures
答案2
从最近的tar
手册页:
-C
,--directory=
目录在执行任何操作之前更改为 DIR。该选项是顺序敏感的,即它会影响后面的所有选项。
因此,例如,归档目录的正确方法/srv/www
是:
tar -C /srv/www -czf www.tgz
(请注意,由于您必须以 <directort> 开头,因此您需要用 a-C
表示,以便将它们理解为选项。)-czf
-
当然,您始终可以cd
明确地执行以下操作:
(cd /srv/www; tar czf - .) > www.tgz
答案3
感谢您的编辑。
看起来您正在使用 shell 变量和命令替换来指定要存档的文件名和目录。
这将满足您的需要:
tar czfv $HOME'/Pictures_'$CREATION_TIMESTAMP'.tar.gz' "$DEST" -C Pictures
我添加了v
它以使其变得详细,以便您可以看到发生了什么。该$HOME
变量显然扩展到您的主目录,我认为 $CREATION_TIMESTAMP 是一个时间变量。您声明$DEST
指定了您尝试存档的目录的路径,因此它位于通常所在的末尾。我在 周围加了双引号,$DEST
以防路径包含空格,但如果不包含空格,则可以删除它们。如果 $CREATION_TIMESTAMP 等于上面的内容,$(date +%F_%H%M%S)
那么它不会有空格,因此不需要双引号。删除-C
嵌套,以便仅Pictures
进行压缩。