如何安全地解压缩,而不会在出现 tarbomb 的情况下污染当前目录?

Nic*_*oul 33 tar

尊敬的项目发布包含单个目录tar归档,例如zyrgus-3.18.tar.gz包含一个zyrgus-3.18文件夹中又包含srcbuilddist,等。

但是一些朋克项目将所有内容都放在根目录 :'-( 这会导致解压一团糟。每次手动创建一个文件夹是一件痛苦的事情,而且在大多数情况下都是不必要的。

  • 是否有一种超快速的方法可以判断 .tar 或 .tar.gz 文件在其根目录中是否包含多个目录?即使对于一个大档案。
  • 或者更好的是,是否有一种工具可以在这种情况下创建一个目录(不带扩展名的存档名称)并将所有内容放入其中?

Mar*_*rco 30

patool处理不同类型的档案并创建一个子目录,以防档案包含多个文件,以防止工作目录被提取的文件弄乱。

提取存档

patool extract archive.tar
Run Code Online (Sandbox Code Playgroud)

要获取支持格式的列表,请使用patool formats.


Dan*_*ica 12

你可以做类似的事情

tar tf thefile.tar | cut -d/ -f1 | sort -u
Run Code Online (Sandbox Code Playgroud)

查看 tar 具有哪些顶级条目;管道以wc -l检查是否有多个。请注意,在某些情况下这会失败,例如,如果 tar 包含表单的文件路径somedir/whatever以及./somedir/whatever(或者更疯狂的东西);不过,这应该不常见。

这将在输出任何内容之前读取整个 tar 文件,因为sort它应该比实际提取更快,因为它只是一个顺序读取并且可以跳过大文件。

如果您以交互方式执行此操作并且文件可能很大,并且如果它打印出不止一件事,您可以更改sort -uuniqControl+ C

  • 除非你想做`uniq -c` (4认同)
  • `排序| uniq` 可以缩写为 `sort -u`。 (2认同)

mik*_*erv 7

你可以做:

pax <some.tar
Run Code Online (Sandbox Code Playgroud)

...列出tar文件的内容。

如果你想知道它有多少层深,你可以这样做:

pax <some.tar | tr -dc /\\n | sort -r | head -n1
Run Code Online (Sandbox Code Playgroud)

您可以通过以下方式明确禁止提取爆炸:

mkdir some.tar
pax -'rs|^|some.tar/|' <some.tar
Run Code Online (Sandbox Code Playgroud)