通过排除父文件夹,为多个目录创建单个tar文件

15

我正在编写一个Bash Shell脚本,用于创建多个文件夹的tar文件,通过排除父文件夹并将其应用到所有目录中(同时排除指定文件夹)。

目录结构如下:

$ ls dir1
dir11 testdir

$ ls dir2
dir12 testdir2

$ ls dir3
dir13 testdir3

$ tar -cvf file1.tar dir1 dir2 dir3 --exclude="test*"

上述内容运行良好。

但我不想在tar包中包含dir1、dir2和dir3文件夹。我只需要里面的文件和目录。

因此,我的最终tar应包含以下内容:

$ tar -tvf file1.tar
dir11 dir12 dir13

有人能帮我解决这个问题吗?先谢谢了。

1个回答

26

如果我正确理解了问题,您可以使用-C(大写的C=更改目录)选项,例如:

tar cvf /tmp/some.tar -C /path/to/dir1 . -C /path/to/dir2 .    #multiple -C allowed

用它来检查

 tar cf - -C /path/to/dir1 . -C /path/to/dir2 .  | tar tvf -

例子:

创建测试用例

cd /tmp
mkdir test
cd test
mkdir -p {dir{1..3},testdir}
touch dir1/file{1..3} dir2/file{4..6} dir3/file{7..9}

这棵树现在是:

$ find . -print
.
./dir1
./dir1/file1
./dir1/file2
./dir1/file3
./dir2
./dir2/file4
./dir2/file5
./dir2/file6
./dir3
./dir3/file7
./dir3/file8
./dir3/file9
./testdir

该tar命令:

tar cf - -C dir1 . -C ../dir2 . -C ../dir3 . | tar tvf -

tar文件的内容如下:

drwxr-xr-x  0 jm    staff       0 14 aug 13:07 ./
-rw-r--r--  0 jm    staff       0 14 aug 13:07 ./file1
-rw-r--r--  0 jm    staff       0 14 aug 13:07 ./file2
-rw-r--r--  0 jm    staff       0 14 aug 13:07 ./file3
drwxr-xr-x  0 jm    staff       0 14 aug 13:08 ./
-rw-r--r--  0 jm    staff       0 14 aug 13:10 ./file4
-rw-r--r--  0 jm    staff       0 14 aug 13:10 ./file5
-rw-r--r--  0 jm    staff       0 14 aug 13:10 ./file6
drwxr-xr-x  0 jm    staff       0 14 aug 13:08 ./
-rw-r--r--  0 jm    staff       0 14 aug 13:10 ./file7
-rw-r--r--  0 jm    staff       0 14 aug 13:10 ./file8
-rw-r--r--  0 jm    staff       0 14 aug 13:10 ./file9

如果您想要其他内容,请编辑您的问题。


1
tar:dir2:无法统计:文件或目录不存在 tar:dir3:无法统计:文件或目录不存在 tar:由于之前的错误,退出失败状态 - user27
4
@user27 每次切换目录都是相对于当前目录的。请看上面的示例。你应该使用../dir2(从dir1)或者像我在回答的第一部分所说的那样使用完整的路径名。 - clt60
很酷,但请更明确地指出路径应该是绝对的。 - ceztko
@ceztko,如测试用例所示,也可以使用相对路径,或者请更具体地说明问题所在。 - clt60
@jm666 可以使用相对路径,但从直觉上来讲,相对路径应该始终相对于命令调用目录(这将是更合理的行为)。回答可以指定第一个示例中的路径为绝对路径,以获得更好的可读性和快速可用性。 - ceztko
显示剩余5条评论

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