我有一个目录列表。有些目录需要以递归方式将它们打包,其他目录只需要该目录中存在的文件,不需要子目录:使用下面的目录/文件作为示例,我的 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.tar
f
- 我们的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.tar
A
.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
$