删除通过adb push推送中文目录导致的乱码文件夹

CListery ARE YOU OK?

闲来无事看看片,作为一名合格(bushi)的开发者,一般电脑下载好的影片就喜欢用 adb 推到手机上再慢慢享用

概述

在互联网上下载了一部影片,这部影片带了一个中文目录,在 adb push 的时候也没有修改这个目录的名称,就直接复制到手机的 /sdcard/Download 目录了,结果回头想要看一下这部片子的时候进到 /sdcard/Download 目录下后发现该目录名称是乱码,并目录变成了一个大小为 0 的文件,这时想到了应该是 GBK 编码导致的问题,所以想删除该目录及其下的文件,首先是通过手机自带的文件管理器删除失败,再通过 termux 删除也失败,再使用 MT文件管理 删除失败,最后切换到 PC 端,使用 adb 还是无法删除,最后通过 root 权限进入 /data/media/0/Download 目录下删除成功。

目录结构

这种目录结构简直 debuff 叠满,最后会说为什么

1
2
3
4
/sdcard
└── /Download
   └── \236\347
      └── xxx.mp4

解决思路

通过 adb shell 获取到该乱码目录的索引码 inode number

1
2
3
4
5
adb shell
cd /sdcard/Download
ls -li
# 记录下乱码目录的索引码: 473168
473168 drwxrws--- 2 u0_a236 media_rw 3452 2025-12-04 09:42 \236\347

进入到 root 下删除该目录及其下的文件

1
2
3
4
su
cd /data/media/0/Download
find . -inum 473168 -exec rm -rf {} \;
# 执行命令有可能报错,但是最终会成功删除掉该目录

解析

为什么要拿到索引码

因为在 adb shell 的环境下很可能无法直接输入中文,而且就算你输入了中文也很可能与目标文件名编码不一致

为什么需要 root 并进入 /data/media/0 下进行删除操作

首先,乱码目录下面有文件,系统在进行删除这个目录时会先进行目录下文件的删除,这会导致找不到文件的父级目录(乱码了),如果乱码本身的只是文件,而没有任何乱码的父级目录还好,那就不需要进入到 /data/media/0 下面进行删除,这相当于 debuff 叠满了,无论移动这个乱码文件夹还是移动下面的子文件到其他地方都不行。

这个问题的根本原因其实是安卓底层 fuse(FILESYSTEM IN USERSPACE) 的 bug,不管你使用哪种方式对 /sdcard 下面的文件进行操作,最终都会进入 fuse ,所以我们需要 root 后进入到 /data/media/0 才能绕过 fuse ,从而直接删除真实文件。

  • 标题: 删除通过adb push推送中文目录导致的乱码文件夹
  • 作者: CListery
  • 创建于 : 2025-12-04 17:58:10
  • 更新于 : 2025-12-05 11:01:11
  • 链接: http://clistery.github.io/2025/12/04/android/delete-gbk-code-file/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论