如何在不保留目录结构的情况下压缩一个目录?

115

我正在编写一个备份脚本,想要打包一个文件目录:

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

这会将它打成tar包,但是当我解压缩得到的文件时,它包含了完整的文件结构:文件在home/username/drupal/sites/default/files中。

有没有一种方法可以排除父目录,这样生成的tar只知道最后一个目录(files)?

11个回答

195

使用 --directory 选项:

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

7
如果我想在这里放置两个目录,该怎么办? - Shanpei Zhou
@user3352668 只需添加两个目录。例如,如果默认包含“files”和“morefiles”,只需将“morefiles”添加到nbt字符串中即可。顺便说一句:最佳解决方案是nbt的,应该被接受为答案。 - Anonymous
8
"-C DIR" 相当于 "--directory=DIR",将当前工作目录更改为 DIR。 - Markus
1
我想提一下这里的顺序很重要。你不能把 --directory="/home/username/drupal/sites/default files" 放在目标 ~/backup.tgz 的前面。 - Chris Stryczynski
6
注意,--directory 选项所给出的路径不是 "/home/username/drupal/sites/default files"。它是 /home/username/drupal/sites/default,后面跟着一个位置参数,指定要打包成 tar 包的目录名称为 files - Chap
显示剩余3条评论

68

嗨,当进入指定目录时(例如Makefile等),我有一个更好的解决方案。

tar -cjvf files.tar.bz2 -C directory/contents/to/be/compressed .
请勿忘记在末尾加上句点(.)!!

6
句子末尾的句号有什么作用? - Bruce Sun
3
@BruceSun,**-C** 选项可以改变你的工作目录,而点号告诉 tar 命令你想要归档哪个目录(即当前工作目录)。 - user12345
3
每个人都谈论-C选项或--directory,但是像@MaikolD提到的那样,在末尾没有小点号“.”时,它不起作用——至少在我的环境中是这样。 - aks
20
这仍然会在tar文件的根目录下留下一个名为"."的文件夹。 - derpedy-doo
2
这样做并不能正确地压缩目录“directory/contents/to/be/compressed”的内容。点号导致创建了一个名为“.”的目录,该目录包含了要压缩的内容。 有没有办法只打包源目录的内容? - user3477889
显示剩余3条评论

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

22
你也可以使用tar的-C选项。 - GuruM
10
CD不被推荐且容易出错,例如大型脚本或makefile。以下答案更通用和正确。 - Gregor
1
尝试在Ubuntu 16.04上使用“-C”和“--directory”选项没有成功。这是唯一有效的选项。 - haxpor
2
这是唯一可行的选项-C添加一个根文件夹,但这不是我们想要的。 - Nicolas Dorier

7

创建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"

在服务器上解压 tar 文件

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

4

基于 nbtMaikoID 的解决方案,我们可以进一步改进:

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(以及它们的子文件和子文件夹)作为第一级目录。


2

要将/home/myuser/workspace/zip_from/中的所有txt(*.txt)文件解压缩到/home/myuser/workspace/zip_to/,并且不保留源文件的目录结构,请使用以下命令:

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

2
如果您想在保留结构的同时部分或完全忽略其内容进行提取,请在提取时使用--strip-components参数。例如,如果完整路径为/home/username/drupal/sites/default/files,则以下命令将提取tar.gz内容而不保留父目录结构,仅保留路径的最后一个目录(例如files/file1)。 tar -xzv --strip-components=5 -f backup.tgz 我在https://www.baeldung.com/linux/tar-archive-without-directory-structure#5-using-the---strip-components-option上找到了这个技巧。

0

对我来说,-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 -

0
这对我有用:
gzip -dc "<your_file>.tgz" | tar x -C <location>

-1
请使用以下命令生成没有目录结构的 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接