没有目录结构的tar压缩

use*_*225 10 tar directory filenames

在我当前的目录下,我有两个子目录:

dir_1/
   - file1.png
   - file2.png
   ...
   - fileN.png

dir_2/
   - fileA.txt
   - ...
   - fileZ.txt
Run Code Online (Sandbox Code Playgroud)

当我通过以下方式对两个目录进行 tar 压缩时:

tar -cvzf result.tar.gz dir_1/ dir_2/ 
Run Code Online (Sandbox Code Playgroud)

我得到了result.tar.gz但它维护了目录结构。我的意思是当我提取result.tar.gz 时,我又得到了dir_1& dir_2

我怎样才能 tar 压缩以便不保留目录结构,这意味着当我提取 tar.gz 文件时,我只得到文件

result/
   file1.png 
   ... 
   fileN.png 
   fileA.txt
   ...
   fileZ.txt
Run Code Online (Sandbox Code Playgroud)

arn*_*efm 15

我认为你可以用这个-C选项来做到这一点。

从 tar 手册页:

-C directory, --cd directory, --directory 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)

这意味着您应该能够运行

tar cvzf result.tar.gz -C /path/to/dir1/ . -C /path/to/dir2/ .
Run Code Online (Sandbox Code Playgroud)

达到你想要的。

  • @user842225 那是因为目录路径是相对的,您需要在第二个路径前面加上 `../` 或使用绝对路径。你也不能使用 `*`,因为它会扩展到当前目录中的文件列表,你可以使用 `.` 代替。 (3认同)

Gil*_*il' 5

使用 GNU tar,您可以在--transform将文件名添加到存档或从存档中提取文件名时使用重写文件名的选项。对于 BSD tar 或 pax,该选项-s执行相同的操作。

要删除前导目录组件(以便dir_1/subdir/somefile存储为subdir/somefile):

tar -czf result.tar.gz --transform '!^[^/]*/!!' dir_1 dir_2
Run Code Online (Sandbox Code Playgroud)

要删除所有目录组件(以便dir_1/subdir/somefile存储为somefile):

tar -czf result.tar.gz --transform '!^.*/!!' dir_1 dir_2
Run Code Online (Sandbox Code Playgroud)