如何压缩多个文件夹,一些以递归方式,一些以非递归方式

如何压缩多个文件夹,一些以递归方式,一些以非递归方式

我有一个目录列表。有些目录需要以递归方式将它们打包,其他目录只需要该目录中存在的文件,不需要子目录:使用下面的目录/文件作为示例,我的 tar 命令将如下所示:

/tmp/dir1/ - Recursively
/tmp/dir2/ - Only the files that exist in that directory, no subdirectories
/tmp/dir3/file1 - Only this single file.

答案1

以下是我的想法:

首先,我使用的目录结构作为示例:

$ find dir1 dir2 dir3 -print
dir1
dir1/file1
dir1/file2
dir1/sub_dir1
dir1/sub_dir1/file1
dir2
dir2/file1
dir2/file2
dir2/sub_dir1
dir2/sub_dir1/file1
dir3
dir3/file1
$

接下来,我的解决方案由三个命令组成:

第一个命令:

tar cvf archive.tar dir1

相当标准。让我们分解一下:

  • c- 创造
  • v- 详细(让我们看看发生了什么)
  • f- 在我们的例子中,我们想要的文件名archive.tar
  • archive.tarf- 我们的switch的实际参数
  • dir1- 我们真正想要的是

第二条命令:

find dir2 -maxdepth 1 -type f -print0 | xargs -0 tar rvf archive.tar

让我们分解一下:

  • find dir2- 我们想要搜索的地方。
  • -maxdepth 1- 不要比深度 1 更深(保持在根部dir2
  • -type f- 搜索文件
  • -print0- 不要在末尾打印换行符,而是使用空字符。如果 find 找到包含空白符的文件,这将对我们有所帮助。
  • | xargs -0- 我们用 find 命令找到的标准输入被抛到这里来执行,同时尊重我们的print0
  • tar rvf- 这里唯一的新开关是。这是我们的附加选项。它在末尾r添加了 our 。不要与特定于附加其他档案的选项 ( -s ) 混淆。archive.tarA.tar
  • archive.tar- 我们想要附加到的 tar。

    此命令的末尾就是我们使用 stdinput 的地方。例如archive.tar <stdinput>

第三条命令:

tar rvf archive.tar dir3/file1

从追加到archive.tar单个文件 ( file1) dir3

最后,tar 创建后是什么样子的。该t选项用于打印出其内容。

$ tar tvf archive.tar
drwxrwxr-x mmallard/mmallard 0 2019-07-18 16:02 dir1/
-rw-rw-r-- mmallard/mmallard 0 2019-07-18 16:01 dir1/file1
-rw-rw-r-- mmallard/mmallard 0 2019-07-18 16:01 dir1/file2
drwxrwxr-x mmallard/mmallard 0 2019-07-18 16:02 dir1/sub_dir1/
-rw-rw-r-- mmallard/mmallard 0 2019-07-18 16:02 dir1/sub_dir1/file1
-rw-rw-r-- mmallard/mmallard 0 2019-07-18 16:02 dir2/file1
-rw-rw-r-- mmallard/mmallard 0 2019-07-18 16:02 dir2/file2
-rw-rw-r-- mmallard/mmallard 0 2019-07-18 16:02 dir3/file1
$

相关内容