当前位置:首页>Linux>linux中一堆文件不小心解压到当前目录怎么处理——2

linux中一堆文件不小心解压到当前目录怎么处理——2

  • 2026-09-12 20:48:30
linux中一堆文件不小心解压到当前目录怎么处理——2

linux中一堆文件不小心解压到当前目录怎么处理——2

前天发了一个关于不小心解压zip文件内容到当前目录的处理,结果被微信推到流量池了,一晚上几千个人浏览,还给我评论指出问题,现在我意识到问题了,我再更新一下内容。

1,怎么避免这样的问题?

对于压缩包的解压,最好还是在固定目录里解压,就是自己先mkdir一个新的目录,然后放进去解压,我发的处理方案,都是实在没办法,不小心造成的,尽量规避这样的情况,养成好习惯后就能大幅避免。

2,zipinfo -1 和unzip -Z1的区别

zipinfo -1 path/xx.zip | xargs rm -rf这个命令是大家留言和推荐的,我用的是unzip -Z1 new-api.zip | xargs rm -rf。

这两个其实没区别,风险一样的大。

它们只是用来“提取 ZIP 文件列表”的工具不同,但最终输出的内容、格式,以及后面接 xargs rm -rf 的危险行为一模一样。

详细对比(一目了然)

项目
zipinfo -1 path/xx.zip | xargs rm -rfunzip -Z1 new-api.zip | xargs rm -rf
区别?
核心功能
列出 ZIP 里所有文件路径(每行一个)
列出 ZIP 里所有文件路径(每行一个)
无
输出格式
纯文件名列表(无额外信息)
纯文件名列表(无额外信息)
无
对空格的处理
一样会崩(xargs 默认按空格拆分)
一样会崩(xargs 默认按空格拆分)
无
对 /、..、/* 的处理
一样会直接传给 rm -rf
一样会直接传给 rm -rf
无
最终删除行为
把 ZIP 里的路径当成真实文件/文件夹强制删除
把 ZIP 里的路径当成真实文件/文件夹强制删除
无
命令来源zipinfo
 命令(独立工具)
unzip
 命令的 -Z1 模式
唯一区别
系统依赖
需要安装 zipinfo(很多系统和 unzip 一起装)
需要 unzip(几乎所有 Linux/macOS 都自带)
轻微

为什么 -Z1 这么像?

  • unzip -Z1 其实就是 unzip 内置的 zipinfo 模式。
  • 官方文档里明确说:unzip -Z1 等价于 zipinfo -1。
  • 很多老鸟甚至直接用 unzip -Z1 来替代 zipinfo,因为 unzip 更常用、更稳定。

一句话总结: 你把 zipinfo -1 换成 unzip -Z1,就跟把“苹果”换成“红富士苹果”一样——效果一模一样,危险程度也完全相同。

危险提醒(老生常谈,但必须再说)

这两条命令依然是核弹级危险:

  • 空格文件名 → 删错/漏删
  • 包含 ../ 或 / 开头 → 可能删到上级目录甚至系统文件
  • 包含 * 或 /* → 直接变成 rm -rf /*(系统直接完蛋)

无论你用哪一条,都一样会出事!

真正安全的写法(推荐你立刻换成这个)

# 1. 最安全(推荐):null 分隔 + 预览,带上根目录排查unzip -Z1 new-api.zip | grep -E '^[^/]+/?$' | tr '\n''\0' | xargs -0 -I {} echo"将要删除:{}"# 确认没问题后再把 echo 换成 rm -rfunzip -Z1 new-api.zip | tr '\n''\0' | xargs -0 rm -rf
image-20260326110043582

3,为什么说之前的代码危险

我看评论说,加入zip压缩包里,文件名有空格,就倒霉了。

这样说是有道理的。

我自己测试了一下,创建3个文件名字分别是:

/*test1 test2test3

第一个文件名字代表了根本目录所有文件。

第二个文件名字有空格。

第三个文件就是普通文件。

#仅用于学习测试python3 -c 'import zipfilewith zipfile.ZipFile("danger.zip", "w") as z:    z.writestr("/*", "恶意内容 - 文件1 /*".encode("utf-8"))    z.writestr("test1 test2", "恶意内容 - 文件2 带空格".encode("utf-8"))    z.writestr("test3", "恶意内容 - 文件3".encode("utf-8"))print("ZIP 创建完成!")'

这个确实是恶意的zip文件。

返回:

[root@kichen test]# python3 -c ' zipfile.ZipFile> import zipfile("danger.zip", "> with zipfile.ZipFile("danger.zip", "w") as z:>     z.writestr("/*", "恶意内容 - 文件1 /*".encode("utf-8"))>     z.writestr("test1 test2", "恶意内容 - 文件2 带空格".encode("utf-8"))>     z.writestr("test3", "恶意内容 - 文件3".encode("utf-8"))> print("ZIP 创建完成!")> 'ZIP 创建完成![root@kichen test]# lsdanger.zip 
[root@kichen test]# unzip -Z1 danger.zip/*test1 test2test3

如果这个zip压缩包,用我说的代码:

#保险期间,我还是把后面注释掉吧unzip -Z1 danger.zip #| xargs rm -rf#或者zipinfo -1 danger.zip #| xargs rm -rf

这样,就会把根目录大部分文件删掉。

千万别试!!!!!!!!!!!!!!

返回:

[root@kichen test]# unzip -Z1 danger.zip/*test1 test2test3[root@kichen test]# zipinfo -1 danger.zip/*test1 test2test3

这样,虽然带空格的文件能删除,但是,也会删除根目录下几乎所有文件和目录,后果极其严重(系统很可能无法启动)。”

如果用我纠正后的代码:

unzip -Z1 danger.zip | grep -E '^[^/]+/?$' | tr '\n''\0' | xargs -0 -I {} echo"将要删除:{}"

返回:

[root@kichen test]# unzip -Z1 danger.zip | grep -E '^[^/]+/?$' | tr '\n' '\0' | xargs -0 -I {} echo "将要删除:{}"将要删除:test1 test2将要删除:test3

即便是不加前面的根目录排除:

[root@kichen test]# unzip -Z1 danger.zip| tr '\n' '\0' | xargs -0 -I {} echo "将要删除:{}"将要删除:/*将要删除:test1 test2将要删除:test3

自己不是眼瞎的话,也能看到 /*这个根目录。

所以总结一下,盲目的用zipinfo -1 和unzip -Z1,是有很大风险的,好习惯还是养成,解压文件,要新建一个目录,另外程序员里好人还是多,没人故意做danger.zip这种核弹。

最后,重申一遍:

以上测试完全是学习交流,请勿测试,如果闯祸,后果自负!另外,永远不要用 root 权限解压来历不明的 ZIP!

最新文章

随机文章