~/storage/ 下 6 个子目录的用途与映射关系,安装并使用 ranger 终端文件管理器浏览、复制、删除文件;使用 zip/tar/gzip/zstd 四种格式压缩解压文件,在 Termux 和电脑之间通过 SSH、rsync 互传文件,编写自动整理 Downloads 目录的 bash 脚本(按扩展名分类归档),为后续所有涉及文件读写的实战项目铺平道路。你已经在上一篇中接触过 ~/storage/ 这个目录,但还没深入了解它背后的机制。要理解为什么 Termux 访问手机文件需要特殊操作,得先搞清楚 Android 的存储分区设计。
Android 把每个 App 关在一个叫"沙箱"的隔离目录里。Termux 的沙箱是 /data/data/com.termux/files/,这里面的文件只有 Termux 自己能读写。你在手机相册拍的照片、在浏览器下载的文件,都在另一个叫"共享存储"的区域,默认对 Termux 不可见。
这个隔离是 Android 安全模型的核心设计。试想如果任何 App 都能随意读取其他 App 的文件,那恶意软件可以轻松偷走你的照片、聊天记录。沙箱机制保证了 Termux 装的 Python 脚本碰不到微信的数据库——除非你主动授权。
| 区域 | 路径 | Termux 访问 |
|---|---|---|
| App 沙箱 | /data/data/com.termux/files/ |
自由读写 |
| 共享存储 | /storage/emulated/0/ |
需授权后可读写 |
"需授权"这一步就是通过 termux-setup-storage 命令完成的。执行后 Android 会弹出一个存储权限授权对话框,点击"允许"后 Termux 才能访问共享存储区域的文件。
上一篇你已经执行过这个命令,现在来理解它到底做了什么。termux-setup-storage 做了三件事:申请 Android 存储权限 → 在 $HOME 下创建 storage 目录 → 在其中建立指向共享存储各子目录的符号链接。
验证符号链接的存在:
开头的 l 表示这是符号链接(symlink),类似 Windows 的快捷方式。通过这些链接,你在 Termux 里操作 ~/storage/downloads/ 实际上就是在操作手机的 /storage/emulated/0/Download/ 目录。
No such file or directory
termux-setup-storage 没执行或被拒绝了权限。重新执行 termux-setup-storage,在弹出的授权对话框中点"允许"。如果对话框不再弹出,去系统设置 → 应用 → Termux → 权限 → 存储,手动开启。
每个符号链接指向手机共享存储的一个特定子目录,对应不同类型的文件。记住这些映射关系,以后在 Termux 里找手机文件就不用瞎摸了。
| 链接名 | 指向 | 内容 |
|---|---|---|
shared |
/storage/emulated/0 |
内部存储根目录,可访问所有文件 |
downloads |
/storage/emulated/0/Download |
浏览器和App下载的文件 |
dcim |
/storage/emulated/0/DCIM |
相机拍摄的照片和视频 |
pictures |
/storage/emulated/0/Pictures |
截图、保存的图片 |
music |
/storage/emulated/0/Music |
音乐文件 |
movies |
/storage/emulated/0/Movies |
视频文件 |
先在手机浏览器下载一个文本文件(或用其他 App 创建一个),然后在 Termux 中查看:
反过来,你在 Termux 里生成的文件也可以直接写到手机存储中,用其他 App 打开:
执行后打开手机的"文件管理"App,在 Download 目录下就能看到 hello.txt。这就是 Termux 与手机存储双向通信的基础。
shared 是万能入口,能访问共享存储下的所有子目录。但优先用专用链接(如 downloads、dcim),因为路径更短、语义更清晰,脚本也更易读。上一篇用 ls、cd、cp 命令操作文件已经够用了,但当目录层级深、文件数量多时,逐条敲命令效率不高。ranger 是一个基于终端的全屏文件管理器,用方向键就能浏览、复制、删除、预览文件,体验接近图形界面的文件管理器。
启动后进入全屏三栏界面:左栏是上级目录,中栏是当前目录文件列表,右栏是选中文件的预览。在手机上,三栏可能挤在一起,但核心操作不变。
| 按键 | 作用 | 说明 |
|---|---|---|
j / k |
上下移动 | Vim 风格,j 下 k 上 |
h / l |
返回上级 / 进入目录 | h 返回上级,l 进入选中目录 |
yy |
复制选中文件 | yank(复制到缓冲区) |
dd |
剪切选中文件 | move(剪切到缓冲区) |
pp |
粘贴文件 | 在当前目录粘贴缓冲区文件 |
D |
删除文件 | 大写 D,删除选中文件 |
q |
退出 ranger | 按 q 退出到终端 |
用 ranger 浏览手机下载目录,把一个文件从下载目录复制到 Termux 工作区:
ranger ~/storage/downloads/
j/k 移动到目标文件,按 yy 复制
h 返回上级,导航到 ~(家目录)
pp 粘贴文件到家目录
q 退出,回到终端验证文件已复制
上一篇你已经打通了 Termux 与手机存储的通道。现在文件可以自由读写了,但传输大文件时压缩是必备技能。Linux 世界有四种主流压缩格式,各自适合不同场景。
zip 是兼容性最好的格式,Windows、macOS、Android 都能直接打开。在 Termux 中:
tar 本身只做归档(把多个文件打包成一个),不压缩。但配合 gzip 或 zstd 可以同时归档+压缩。最常见的组合是 .tar.gz:
tar 的参数设计很巧妙:c(create)打包、x(extract)解包、t(list)查看,三个操作只需换一个字母。
gzip 只能压缩单个文件,不能打包目录。通常配合 tar 使用,但也可以单独压缩:
zstd(Zstandard)是 Facebook 开发的现代压缩算法,压缩率接近 gzip,但速度更快。在 Termux 上:
| 格式 | 扩展名 | 压缩率 | 适用场景 |
|---|---|---|---|
| zip | .zip | 中 | 跨平台传输,手机直接打开 |
| tar.gz | .tar.gz | 较高 | Linux 服务器备份、源码分发 |
| zstd | .tar.zst | 高 | 大文件备份,速度+压缩率兼顾 |
上一节的存储映射知识和本节的压缩技能组合起来,就能实现一个常见工作流:从手机下载目录读取文件 → 在 Termux 中处理 → 将结果写回手机存储。这个模式在后续编程实战中会反复用到。
一个完整的示例——下载了一个 CSV 数据文件,在 Termux 中提取关键列,写回手机:
$HOME 下再操作,而不是直接在 ~/storage/ 中处理。共享存储的读写速度受 Android 文件系统层影响,比 Termux 沙箱内的操作慢。先把文件搬进"家里"再加工,最后把成品搬出去。手机和电脑之间的文件互传是高频需求。用数据线太麻烦,微信传文件有大小限制。在 Termux 上,只要手机和电脑在同一个局域网,就能用 SSH 和 rsync 像操作远程服务器一样互传文件。
Termux 自带 SSH 客户端(连出去),但要做服务器(被连入)需要装 openssh:
然后从电脑连接(把 IP 替换为手机实际 IP):
ssh -p 8022 IP地址。这是 Android 无 root 的端口限制,上一篇已详细说明。
scp 只能全量拷贝,而 rsync 只传输变化的部分,大幅减少传输量:
Downloads 目录用久了会堆满各种文件:PDF、图片、压缩包、安装包混在一起。用本系列学到的全部知识,编写一个脚本自动按扩展名归类文件到子目录中。
保存为 ~/organize.sh,运行:
脚本核心逻辑:for 循环遍历 Downloads 目录所有文件 → ${FILE##*.} 提取扩展名 → tr A-Z a-z 转小写 → case 按扩展名映射到分类目录 → mkdir -p 创建分类子目录 → mv 移动文件。这个脚本综合运用了本系列前三篇的全部知识。
ls ~/storage/dcim/ 查看手机相册目录的内容,然后用 ls ~/storage/dcim/ | wc -l 统计有多少个文件。ls ~/storage/dcim/Camera/ | wc -l。
~/storage/shared/ 目录,找到任意一个文本文件(.txt),用 yy + pp 复制到 ~ 家目录。退出 ranger 后用 cat 命令读取复制过来的文件内容。echo "test" > ~/storage/downloads/test.txt 创建一个。
~/.config/ranger/rc.conf。请查阅 ranger 的帮助文档(运行 man ranger 或搜索 "ranger rc.conf configuration"),自定义一个快捷键绑定:按 o 键用 cat 打开选中的文件。test.txt 文件,用 zip 压缩它,然后把压缩包复制到 ~/storage/downloads/,最后在手机文件管理器中确认能找到 test.zip。echo "test" > test.txt && zip test.zip test.txt && cp test.zip ~/storage/downloads/
organize.sh 脚本改进:在移动文件前先检查目标目录是否已存在同名文件,如果存在则在文件名后追加时间戳(如 report_20260815.pdf)避免覆盖。提示:用 date +%Y%m%d 获取日期。mv 之前加 if [ -f "$DIR/$CATEGORY/$(basename "$FILE")" ] 判断,存在则 mv "$FILE" "$DIR/$CATEGORY/$(basename "${FILE%.*}")_$(date +%Y%m%d).${EXT}"。
organize.sh 脚本改造成定时任务:每天凌晨 2 点自动执行。提示:需要用到 cron 或 Termux 的 termux-job-scheduler。同时考虑:脚本执行前如何确保 Termux 没有被系统杀死?需要配合 termux-wake-lock 和 Termux:Boot 吗?这些内容在第 02 篇已经介绍过。