创建不包含父目录的 tar 存档

Suj*_*jan 89 tar

我正在尝试为我的脚本创建一个图形程序。

在脚本中,我使用 tar 来创建一个 tar 存档。

从图形程序中,我获得了要创建 tar 存档的文件的全名。

tar -cvf temp.tar /home/username/dir1/dir2/selecteddir 
Run Code Online (Sandbox Code Playgroud)

我的 tar 存档包括 home、用户名、dir1、dir2 和 selecteddir,而我希望 tar 创建仅包括 selecteddir 的存档。

mkc*_*mkc 116

您可以使用 的-C选项tar来完成此操作:

tar -C /home/username/dir1/dir2 -cvf temp.tar selecteddir
Run Code Online (Sandbox Code Playgroud)

从手册页tar

-C directory
         In c and r mode, this changes the directory before adding the following files.  
         In x mode, change directories after opening the archive but before extracting 
         entries from the archive.
Run Code Online (Sandbox Code Playgroud)

  • 请注意,您不能将 globbing 与 -C 选项一起使用。`tar -C /home/username/dir1/dir2 -cvf temp.tar '*.csv'` 不起作用。 (12认同)
  • 值得补充的是,这对 GNU 和 BSD Tar 都有效。 (2认同)
  • 不起作用:tar:selecteddir:无法统计:没有这样的文件或目录 (2认同)

rya*_*obs 16

您可以使用两种方法来解决此问题。

在我看来,第一个更容易。只需cd进入您要压缩的目录正上方的目录即可。在这种情况下,它将是dir2.

$ cd /home/username/dir1/dir2/
$ tar -cvf temp.tar selecteddir
Run Code Online (Sandbox Code Playgroud)

第二种方法是使用--transform接受sed表达式并针对文件名运行它的选项。注意:您必须/sed表达式中转义。

$ tar -cvf temp.tar /home/username/dir1/dir2/selecteddir --transform='s/\/home\/username\/dir1\/dir2\///g'
Run Code Online (Sandbox Code Playgroud)

  • 我知道这是一篇旧帖子,但以防万一:使用不同的分隔符可能比转义更容易,例如 `--transform='s:/home/username/dir1/dir2/::g'` (3认同)

小智 9

首先,进入工作目录,

cd /your/working/directory/ 
Run Code Online (Sandbox Code Playgroud)

然后使用魔法*:-)

tar -cvf temp.tar *
Run Code Online (Sandbox Code Playgroud)


小智 8

实际上,我使用 Ketan 的回答发现了一个问题

tar -C /home/username/dir1/dir2 -cvf temp.tar selecteddir

当您只想复制 dir2 中的所有文件时,只需复制所有文件,那么我首先提出这个想法:

tar -C /home/username/dir1/dir2 -cvf temp.tar *

但是,当您不在 dir2 目录中时,它会导致问题,因为 * 会在您当前的目录中 tar 文件。我使用下面的命令解决了这个问题:

 tar -C /home/username/dir1/dir2 -cvf temp.tar ./
Run Code Online (Sandbox Code Playgroud)

  • 但是随后您的 _temp.tar_ 存档包含 `.` 作为根文件夹。 (16认同)

mpe*_*pen 8

为了避免出现点目录,您可以在事后将其删除:

tar czC /path/to/dir . --transform='s,^\./,,' >| foo.tgz
Run Code Online (Sandbox Code Playgroud)

这将创建一个仅包含/path/to/dir.