📚 Termux 无 Root 学习开发系列
当前进度:阶段一 · 3/28
阶段一:环境搭建与终端基础
01 Termux 简介与安装
02 包管理与终端基础
03 共享存储与文件管理(当前篇)
04 Vim/Neovim 与 tmux 终端工作流(上):Neovim 编辑器基础
05 Vim/Neovim 与 tmux 终端工作流(下):tmux 多窗口工作流
阶段二至九共 24 篇,后续持续更新

03 共享存储与文件管理:存储映射与文件互传

打通 Termux 与手机存储的壁垒,用 ranger 管理文件,掌握压缩解压与局域网互传
难度:入门 前置:02 包管理与终端基础
读完本篇你将能:理解 Termux 沙箱与 Android 共享存储的隔离机制,掌握 ~/storage/ 下 6 个子目录的用途与映射关系,安装并使用 ranger 终端文件管理器浏览、复制、删除文件;使用 zip/tar/gzip/zstd 四种格式压缩解压文件,在 Termux 和电脑之间通过 SSH、rsync 互传文件,编写自动整理 Downloads 目录的 bash 脚本(按扩展名分类归档),为后续所有涉及文件读写的实战项目铺平道路。
📑 本文目录
01Android 存储分区:沙箱与共享空间
02termux-setup-storage:打通两个世界
03~/storage/ 六大子目录详解
04ranger:终端里的可视化管理器
05压缩解压四件套:zip / tar / gzip / zstd
06Downloads 处理流水线:读取→处理→写回
07Termux 与电脑互传:SSH / rsync / HTTP
08实操项目:自动整理 Downloads 目录

01 Android 存储分区:沙箱与共享空间

你已经在上一篇中接触过 ~/storage/ 这个目录,但还没深入了解它背后的机制。要理解为什么 Termux 访问手机文件需要特殊操作,得先搞清楚 Android 的存储分区设计。

Android 把每个 App 关在一个叫"沙箱"的隔离目录里。Termux 的沙箱是 /data/data/com.termux/files/,这里面的文件只有 Termux 自己能读写。你在手机相册拍的照片、在浏览器下载的文件,都在另一个叫"共享存储"的区域,默认对 Termux 不可见。

Termux 沙箱
/data/data/com.termux/
⇄
共享存储
/storage/emulated/0/

这个隔离是 Android 安全模型的核心设计。试想如果任何 App 都能随意读取其他 App 的文件,那恶意软件可以轻松偷走你的照片、聊天记录。沙箱机制保证了 Termux 装的 Python 脚本碰不到微信的数据库——除非你主动授权。

两层存储,两种权限

区域 路径 Termux 访问
App 沙箱 /data/data/com.termux/files/ 自由读写
共享存储 /storage/emulated/0/ 需授权后可读写

"需授权"这一步就是通过 termux-setup-storage 命令完成的。执行后 Android 会弹出一个存储权限授权对话框,点击"允许"后 Termux 才能访问共享存储区域的文件。

02 termux-setup-storage:打通两个世界

上一篇你已经执行过这个命令,现在来理解它到底做了什么。termux-setup-storage 做了三件事:申请 Android 存储权限 → 在 $HOME 下创建 storage 目录 → 在其中建立指向共享存储各子目录的符号链接。

验证符号链接的存在:

Bash
1
2
3
4
5
6
7
8
ls -la ~/storage/
# 输出示例:
# lrwxrwxrwx dcim -> /storage/emulated/0/DCIM
# lrwxrwxrwx downloads -> /storage/emulated/0/Download
# lrwxrwxrwx movies -> /storage/emulated/0/Movies
# lrwxrwxrwx music -> /storage/emulated/0/Music
# lrwxrwxrwx pictures -> /storage/emulated/0/Pictures
# lrwxrwxrwx shared -> /storage/emulated/0

开头的 l 表示这是符号链接(symlink),类似 Windows 的快捷方式。通过这些链接,你在 Termux 里操作 ~/storage/downloads/ 实际上就是在操作手机的 /storage/emulated/0/Download/ 目录。

⚠️ 常见错误
cat ~/storage/downloads/report.txt 报错 No such file or directory
✓ 修复:说明 termux-setup-storage 没执行或被拒绝了权限。重新执行 termux-setup-storage,在弹出的授权对话框中点"允许"。如果对话框不再弹出,去系统设置 → 应用 → Termux → 权限 → 存储,手动开启。

03 ~/storage/ 六大子目录详解

每个符号链接指向手机共享存储的一个特定子目录,对应不同类型的文件。记住这些映射关系,以后在 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 中查看:

Bash
1
2
3
4
5
6
7
8
9
# 列出下载目录的文件
ls -lh ~/storage/downloads/
# 输出示例:
# -rw-rw---- 1 termux 8.2K report.pdf
# -rw-rw---- 1 termux 415 notes.txt
# -rw-rw---- 1 termux 2.1M image.jpg
# 读取文本文件内容
cat ~/storage/downloads/notes.txt

实操:将文件写回共享存储

反过来,你在 Termux 里生成的文件也可以直接写到手机存储中,用其他 App 打开:

Bash
echo "Hello from Termux!" > ~/storage/downloads/hello.txt

执行后打开手机的"文件管理"App,在 Download 目录下就能看到 hello.txt。这就是 Termux 与手机存储双向通信的基础。

💡 小贴士
shared 是万能入口,能访问共享存储下的所有子目录。但优先用专用链接(如 downloads、dcim),因为路径更短、语义更清晰,脚本也更易读。

04 ranger:终端里的可视化管理器

上一篇用 ls、cd、cp 命令操作文件已经够用了,但当目录层级深、文件数量多时,逐条敲命令效率不高。ranger 是一个基于终端的全屏文件管理器,用方向键就能浏览、复制、删除、预览文件,体验接近图形界面的文件管理器。

安装与启动

Bash
pkg install -y ranger
ranger

启动后进入全屏三栏界面:左栏是上级目录,中栏是当前目录文件列表,右栏是选中文件的预览。在手机上,三栏可能挤在一起,但核心操作不变。

核心操作

按键 作用 说明
j / k 上下移动 Vim 风格,j 下 k 上
h / l 返回上级 / 进入目录 h 返回上级,l 进入选中目录
yy 复制选中文件 yank(复制到缓冲区)
dd 剪切选中文件 move(剪切到缓冲区)
pp 粘贴文件 在当前目录粘贴缓冲区文件
D 删除文件 大写 D,删除选中文件
q 退出 ranger 按 q 退出到终端

实战:用 ranger 管理手机文件

用 ranger 浏览手机下载目录,把一个文件从下载目录复制到 Termux 工作区:

1 启动 ranger:ranger ~/storage/downloads/
2 用 j/k 移动到目标文件,按 yy 复制
3 按 h 返回上级,导航到 ~(家目录)
4 按 pp 粘贴文件到家目录
5 按 q 退出,回到终端验证文件已复制
💡 小贴士
ranger 的按键设计完全遵循 Vim 风格(hjkl 移动),如果你后续学了 Vim/Neovim(第 04 篇),肌肉记忆可以直接迁移。这也是 Linux 终端工具的设计哲学:一套按键体系,到处通用。

05 压缩解压四件套:zip / tar / gzip / zstd

上一篇你已经打通了 Termux 与手机存储的通道。现在文件可以自由读写了,但传输大文件时压缩是必备技能。Linux 世界有四种主流压缩格式,各自适合不同场景。

zip:跨平台通用格式

zip 是兼容性最好的格式,Windows、macOS、Android 都能直接打开。在 Termux 中:

Bash
1
2
3
4
5
6
7
8
9
# 压缩整个目录
zip -r project.zip ~/projects/
# -r 递归压缩子目录
# 解压到当前目录
unzip project.zip
# 解压到指定目录
unzip project.zip -d ~/restored/

tar:Linux 归档标准

tar 本身只做归档(把多个文件打包成一个),不压缩。但配合 gzip 或 zstd 可以同时归档+压缩。最常见的组合是 .tar.gz:

Bash
1
2
3
4
5
6
7
8
9
10
# 打包+gzip压缩
tar -czf backup.tar.gz ~/projects/
# c=创建 z=gzip f=文件名
# 解压
tar -xzf backup.tar.gz
# x=解压
# 查看内容不解压
tar -tzf backup.tar.gz

tar 的参数设计很巧妙:c(create)打包、x(extract)解包、t(list)查看,三个操作只需换一个字母。

gzip:单文件压缩

gzip 只能压缩单个文件,不能打包目录。通常配合 tar 使用,但也可以单独压缩:

Bash
gzip large.log
# 生成 large.log.gz,原文件被替换
gunzip large.log.gz
# 解压还原

zstd:现代压缩之王

zstd(Zstandard)是 Facebook 开发的现代压缩算法,压缩率接近 gzip,但速度更快。在 Termux 上:

Bash
pkg install zstd
tar --zstd -cf backup.tar.zst ~/projects/
tar --zstd -xf backup.tar.zst
格式 扩展名 压缩率 适用场景
zip .zip 中 跨平台传输,手机直接打开
tar.gz .tar.gz 较高 Linux 服务器备份、源码分发
zstd .tar.zst 高 大文件备份,速度+压缩率兼顾

06 Downloads 处理流水线:读取→处理→写回

上一节的存储映射知识和本节的压缩技能组合起来,就能实现一个常见工作流:从手机下载目录读取文件 → 在 Termux 中处理 → 将结果写回手机存储。这个模式在后续编程实战中会反复用到。

下载文件
~/storage/downloads/
→
拷入工作区
~/projects/
→
处理
Python/脚本
→
写回手机
~/storage/downloads/

一个完整的示例——下载了一个 CSV 数据文件,在 Termux 中提取关键列,写回手机:

Bash
1
2
3
4
5
6
7
8
9
10
11
# 1. 从下载目录拷入工作区
cp ~/storage/downloads/data.csv ~/projects/
# 2. 处理:提取前5行
head -5 ~/projects/data.csv > ~/projects/preview.csv
# 3. 写回手机下载目录
cp ~/projects/preview.csv ~/storage/downloads/
# 4. 压缩备份原始数据
gzip ~/projects/data.csv
💡 小贴士
处理大文件时,建议先拷贝到 $HOME 下再操作,而不是直接在 ~/storage/ 中处理。共享存储的读写速度受 Android 文件系统层影响,比 Termux 沙箱内的操作慢。先把文件搬进"家里"再加工,最后把成品搬出去。

07 Termux 与电脑互传:SSH / rsync / HTTP

手机和电脑之间的文件互传是高频需求。用数据线太麻烦,微信传文件有大小限制。在 Termux 上,只要手机和电脑在同一个局域网,就能用 SSH 和 rsync 像操作远程服务器一样互传文件。

SSH:从电脑连接到手机

Termux 自带 SSH 客户端(连出去),但要做服务器(被连入)需要装 openssh:

Bash
1
2
3
4
5
6
7
8
9
10
# 在 Termux 中安装并启动 SSH 服务
pkg install -y openssh
passwd
# 设置密码(输入两次,不显示字符)
sshd
# 启动 SSH 服务(端口 8022)
# 查看手机 IP 地址
ifconfig wlan0 | grep "inet "

然后从电脑连接(把 IP 替换为手机实际 IP):

Bash(电脑端)
ssh -p 8022 192.168.1.100
# 输入刚才设置的密码即可登录
⚠️ 常见错误
ssh -p 22 192.168.1.100 — Termux 无法绑定 1024 以下端口,SSH 用 8022 而非 22
✓ 正确:ssh -p 8022 IP地址。这是 Android 无 root 的端口限制,上一篇已详细说明。

rsync:增量同步利器

scp 只能全量拷贝,而 rsync 只传输变化的部分,大幅减少传输量:

Bash(电脑端)
1
2
3
4
5
6
7
8
9
10
# 电脑 -> 手机:推送文件
rsync -avz ./project/ -e "ssh -p 8022" 192.168.1.100:~/projects/
# a=归档模式 v=详细 z=压缩传输
# 手机 -> 电脑:拉取文件
rsync -avz -e "ssh -p 8022" 192.168.1.100:~/projects/ ./local-backup/
# 注意路径末尾的 / 含义不同:
  ~/projects/  # 目录内容(不含目录本身)
  ~/projects   # 含目录本身

08 实操项目:自动整理 Downloads 目录

Downloads 目录用久了会堆满各种文件:PDF、图片、压缩包、安装包混在一起。用本系列学到的全部知识,编写一个脚本自动按扩展名归类文件到子目录中。

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/bin/bash
# Downloads 自动整理脚本
DIR=~/storage/downloads
COUNT=0
for FILE in "$DIR"/*; do
  if [ -f "$FILE" ]; then
    # 提取扩展名(转小写)
    EXT=$(echo "${FILE##*.}" | tr A-Z a-z)
    
    # 按类型映射到目标目录
    case $EXT in
      pdf|doc|docx|txt|epub) CATEGORY="文档" ;;
      jpg|jpeg|png|gif|webp) CATEGORY="图片" ;;
      mp4|mkv|avi|mov) CATEGORY="视频" ;;
      mp3|flac|wav|aac) CATEGORY="音乐" ;;
      zip|tar|gz|zst|rar|7z) CATEGORY="压缩包" ;;
      apk|xapk) CATEGORY="安装包" ;;
      *) CATEGORY="其他" ;;
    esac
    
    mkdir -p "$DIR/$CATEGORY"
    mv "$FILE" "$DIR/$CATEGORY/"
    COUNT=$((COUNT+1))
  fi
done
echo "整理完成!共移动 $COUNT 个文件"

保存为 ~/organize.sh,运行:

Bash
bash ~/organize.sh
# 整理完成!共移动 15 个文件
ls ~/storage/downloads/
# 文档/ 图片/ 视频/ 音乐/ 压缩包/ 安装包/ 其他/

脚本核心逻辑:for 循环遍历 Downloads 目录所有文件 → ${FILE##*.} 提取扩展名 → tr A-Z a-z 转小写 → case 按扩展名映射到分类目录 → mkdir -p 创建分类子目录 → mv 移动文件。这个脚本综合运用了本系列前三篇的全部知识。

✏️ 动手练习
🟢 基础验证
请在 Termux 中用 ls ~/storage/dcim/ 查看手机相册目录的内容,然后用 ls ~/storage/dcim/ | wc -l 统计有多少个文件。
参考解法:直接执行上述两条命令。dcim 目录通常包含 Camera 子目录,文件数为 1。如果要统计照片数量,用 ls ~/storage/dcim/Camera/ | wc -l。
🟡 组合应用
请用 ranger 浏览 ~/storage/shared/ 目录,找到任意一个文本文件(.txt),用 yy + pp 复制到 ~ 家目录。退出 ranger 后用 cat 命令读取复制过来的文件内容。
参考解法:ranger ~/storage/shared/ → j/k 找到 .txt 文件 → yy → h 导航到家目录 → pp → q → cat 文件名。如果 shared 目录下没有 txt 文件,先用 echo "test" > ~/storage/downloads/test.txt 创建一个。
🔴 开放挑战
ranger 支持自定义配置文件 ~/.config/ranger/rc.conf。请查阅 ranger 的帮助文档(运行 man ranger 或搜索 "ranger rc.conf configuration"),自定义一个快捷键绑定:按 o 键用 cat 打开选中的文件。
🟢 基础验证
请在 Termux 中创建一个 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 篇已经介绍过。
📖 知识回顾
Android 沙箱 共享存储 termux-setup-storage ~/storage/ 映射 符号链接 symlink ranger 文件管理器 Vim 风格 hjkl zip -r tar -czf/-xzf gzip/gunzip zstd SSH 端口 8022 rsync -avz case 分支 文件整理脚本
下篇预告
04 Vim/Neovim 与 tmux 终端工作流(上):Neovim 编辑器基础
将学习 Neovim 安装配置与基础操作,掌握 Vim 风格编辑模式,搭建终端文本编辑工作流
关注持续获取系列更新