ChatGPT解决这个技术问题 Extra ChatGPT

如何在不保留目录结构的情况下 tar 目录?

我正在处理一个备份脚本,并且想要压缩一个文件目录:

tar czf ~/backup.tgz /home/username/drupal/sites/default/files

这会将其压缩,但是当我解压缩生成的文件时,它包含完整的文件结构:文件位于 home/username/drupal/sites/default/files 中。

有没有办法排除父目录,以便生成的 tar 只知道最后一个目录(files)?


T
Tom Aranda

使用 --directory 选项:

 tar czf ~/backup.tgz --directory=/home/username/drupal/sites/default files 

如果我想在这里放 2 个目录怎么办?
@user3352668 只需添加两个目录。例如,如果默认包含“files”和“morefiles”,只需将“morefiles”添加到 nbt 的字符串中。顺便说一句:最好的解决方案是 nbt 的,应该是公认的答案
-C DIR 与 --directory=DIR 相同,将目录更改为 DIR
只是想我会提到这里的订单很重要。您不能将 --directory="/home/username/drupal/sites/default files" 放在目标 ~/backup.tgz 的前面。
@ChrisStryczynski 请注意,--directory 选项给出的路径不是 "/home/username/drupal/sites/default files"。它是 /home/username/drupal/sites/default,后跟一个位置参数,指定要压缩的目录的名称,files
D
Danvil

嗨,我有一个更好的解决方案,当进入指定目录时这是不可能的(Makefiles等)

tar -cjvf files.tar.bz2 -C directory/contents/to/be/compressed .

不要忘记最后的点(。)!


最后的点有什么作用?
@BruceSun -C 更改您的工作目录。点告诉 tar 您要归档哪个目录(即当前工作目录)。
如果您省略最后的点,您可能会收到警告:tar: Cowardly refusing to create an empty archive
每个人都在谈论 -C 选项或 --directory 但没有小“。”最后正如@MaikolD 提到的那样,它不起作用 - 至少在我的环境中。
这仍然会在 tar 的根目录中留下一个 . 文件夹
J
John Gibb
cd /home/username/drupal/sites/default/files
tar czf ~/backup.tgz *

您还可以使用 tar 的 -C 选项。
不推荐使用 cd 并且容易出错,例如大脚本或 makefile。下面的答案更普遍可用和正确。
在 Ubuntu 16.04 上尝试 -C--directory 对我不起作用。这是唯一有效的选项。
这是唯一有效的选项 -C add a .根文件夹,这不是我们想要的。
u
upe

创建一个 tar 存档

tar czf  $sourcedir/$backup_dir.tar --directory=$sourcedir WEB-INF en

在本地机器上解压文件

tar -xvf $deploydir/med365/$backup_dir.tar -C $deploydir/med365/

上传到服务器

scp -r -i $privatekey $sourcedir/$backup_dir.tar $server:$deploydir/med365/
echo "File uploaded.. deployment folders"

在服务器上解压

ssh -i $privatekey $server tar -xvf $deploydir/med365/$backup_dir.tar -C $deploydir/med365/

M
Manos Nikolaidis

要在没有源文件目录结构的情况下将所有 txt (*.txt) 文件从 /home/myuser/workspace/zip_from/ 压缩到 /home/myuser/workspace/zip_to/,请使用以下命令:

tar -P -cvzf /home/myuser/workspace/zip_to/mydoc.tar.gz  --directory="/home/myuser/workspace/zip_from/" *.txt

D
Druckles

nbt'sMaikoID's 解决方案的基础上构建:

tar -czf destination.tar.gz -C source/directory $(ls source/directory)

这个解决方案:

包括目录中的所有文件和文件夹

最终产品中不包含任何目录结构(或 .)

不需要您更改目录。

但是,它需要两次给定目录,因此它可能在另一个脚本中最有用。如果 source/directory 中有很多文件/文件夹,它的效率也可能会降低。根据需要调整子命令。

例如,对于以下结构:

|- source
|  |- one
|  `- two
`- working

以下命令:

working$ tar -czf destination.tar.gz -C ../source $(ls ../source)

将生成 destination.tar.gz,其中 onetwo(以及子文件/文件夹)都是第一项。


V
Vishrant

这对我有用:

gzip -dc "<your_file>.tgz" | tar x -C <location>

A
Aashutosh Taikar

对我来说 -C 或 --directory 不起作用,我用这个

cd source/directory/or/file
tar -cvzf destination/packaged-app.tgz *.jar
# this will put your current directory to what it previously was
cd -

a
atline

请使用以下命令生成没有目录结构的 tar 文件

tar -C <directoryPath> -cvzf <Path of the tar.gz file> filename1 filename2... filename N

例如:

tar -C /home/project/files -cvzf /home/project/files/test.tar.gz text1.txt text2.txt

M
Manos Nikolaidis
tar -Cczf ~/backup.tgz /home/username/drupal/sites/default/files

-C 为你做 cd


这行不通。请参阅 MaikoID 和 Neil Butterworth 的解决方案。
-C 有效,但必须像 -C <dir> file1 file2 ... 一样使用