如何将tar文件中仅打包路径中的最后一个目录?

5

我该如何将路径中的最后一个目录打包到tar文件中? 例如,我有几个路径:

/usr/local/files/dir1/

   file1.txt
   file2.txt
   file3.txt

/usr/local/files/dir2/

   file3.txt
   file4.txt
   file5.txt

如果我运行该命令:

tar czf my_arch.tar.gz -C /usr/local/files/dir1 .

我仅获得对目录的控制权,而不是包括该目录本身。
因此,我有my_arch.tar.gz/file1.txt、file2.txt和file3.txt,但我需要在我的归档文件中得到下面这样的结构 -
my_arch.tar.gz/dir1/file1.txt, file2.txt, file3.txt

我该怎么做呢?

谢谢。

5个回答

3

您不能直接通过tar完成这项操作。以下是我的建议:

#!/bin/bash
mydir=/my_dir/whit/long_and/complicated_path/the_stuff_is_here
dirname=$(dirname $mydir )
basename=$(basename $mydir )

 tar cvf /tmp/$basename.tar    -C $dirname $basename  

你让它变得太复杂了。为什么不使用扩展来处理这些变量呢? - nethero

3

尝试

cd /usr/local/files
tar -cvzf my_arch.tar.gz dir1

-C指令将让您切换到dir1,从而不会存档文件夹本身,但会存档其内容:
 -C, --directory DIR
     change to directory DIR

运行大型脚本时,不安全使用cd命令。 - tenzor
1
你没有说明你正在运行一个脚本。 为什么它是“不安全”的? “-C”标志也会导致tar进入目录。如果你担心不存在的目录,你可以添加错误处理cd /usr/local/files/dir1 || { dostuff; } - John
1
此外,如果您担心在主线程中更改目录,可以通过添加括号来使用子shell: ( cd /usr/local/files tar -cvzf my_arch.tar.gz dir1 )。 - John

3
$ tar vczf tmp/export/files.tar.gz -C tmp/export src

files.tar.gz的结构

src
src/app
src/app/main.js
src/app/util
src/app/util/runtime.js

0

如果我正确理解您的问题,您希望您的tar文件包含该目录。

尝试不使用-C标志:

tar -czf my_arch.tar.gz /usr/local/files/dir1

我忘了 - 我不需要保存路径结构。除了最后一个文件夹。 - tenzor
你能更清楚地解释一下“最后一个文件夹”吗?你的意思是你只想归档 ls 列出的最后一个文件夹的内容吗? - Al Pacifico
1
@AlPacifico 我认为他的意思是dir1是最后一个目录,然后tar应该包含dir1/file1、file2等所有文件。当解压缩时,它应该提取dir1目录和其中的所有文件。我也在寻找同样的东西,但找不到。 - kiranking

-1
如果您指定了-C,则目录路径为./。可能以下内容符合您的要求:
$ touch asdf/foo/bar/{1,2,3}
$ tree asdf/
asdf/
└── foo
    └── bar
        ├── 1
        ├── 2
        └── 3

2 directories, 3 files
$ tar -cv -C asdf/foo/bar/ -f asdf.tar ./
./
./3
./2
./1
$ tar tf asdf.tar
./
./3
./2
./1

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