NuttX命令行文件和目录操作完全指南:NSH Shell实战详解
引言
在 NuttX 嵌入式操作系统中,NuttShell(NSH)是一个功能强大的命令行界面,提供了丰富的文件和目录操作命令。这些命令类似于 Linux shell 中的常用命令,但针对嵌入式环境进行了优化。
本文将以 SIM 板卡为实例,详细介绍 NuttX NSH 中常用的文件和目录操作命令,帮助你快速掌握嵌入式环境下的文件管理技能。
一、环境准备
1.1 启动 SIM 模拟器
bash
# 加载 SIM:NSH 配置
cd nuttx
./tools/configure.sh sim:nsh
# 编译
make clean
make -j$(nproc)
# 运行模拟器
./nuttx
启动后会进入 NSH 命令行界面:
NuttShell (NSH) NuttX-12.10.0
nsh>
1.2 查看可用命令
bash
nsh> help
会显示所有可用的命令列表,其中文件和目录相关的命令包括:
. cd echo hexdump mkfatfs pwd source unset
[ cp exec kill mkrd readlink test usleep
? cmp exit losetup mount rm time xd
basename dirname false ln mv rmdir true
break dd free ls poweroff set uname
cat df help mkdir ps sleep umount
二、目录操作命令
2.1 pwd - 显示当前工作目录
功能:Print Working Directory,显示当前所在的绝对路径
语法:
bash
pwd
示例:
bash
nsh> pwd
/
2.2 cd - 切换工作目录
功能:Change Directory,切换到指定目录
语法:
bash
cd [<dir-path>|-|~|..]
参数说明:
| 形式 | 说明 |
|---|---|
cd <dir-path> |
切换到指定路径 |
cd - |
切换到上一次工作目录($OLDPWD) |
cd 或 cd ~ |
切换到 home 目录(默认为 /) |
cd .. |
切换到父目录 |
示例:
bash
nsh> cd /tmp
nsh> pwd
/tmp
nsh> cd ..
nsh> pwd
/
nsh> cd -
nsh> pwd
/tmp
2.3 ls - 列出目录内容
功能:List,列出目录中的文件和子目录
语法:
bash
ls [-R] [-s] [-l] [-a] [<dir-path>]
参数说明:
| 参数 | 说明 |
|---|---|
-R |
递归显示所有子目录内容 |
-s |
显示文件大小 |
-l |
长格式显示(包含权限、大小、时间等) |
-a |
显示所有文件(包括隐藏文件) |
示例:
bash
# 列出根目录内容
nsh> ls
/:
dev/ etc/ proc/ tmp/ usr/
# 长格式显示
nsh> ls -l
/:
drwxr-xr-x 1 0 0 0 dev/
drwxr-xr-x 1 0 0 0 etc/
drwxr-xr-x 1 0 0 0 proc/
drwxrwxrwx 1 0 0 0 tmp/
drwxr-xr-x 1 0 0 0 usr/
# 递归显示
nsh> ls -R /tmp
/tmp:
/tmp:
2.4 mkdir - 创建目录
功能:Make Directory,创建新目录
语法:
bash
mkdir [-p] <dir-path>
参数说明:
| 参数 | 说明 |
|---|---|
-p |
递归创建父目录(如果不存在) |
示例:
bash
# 创建单个目录
nsh> mkdir /tmp/test
nsh> ls /tmp
/tmp:
test/
# 递归创建多级目录
nsh> mkdir -p /tmp/a/b/c
nsh> ls -R /tmp/a
/tmp/a:
b/
/tmp/a/b:
c/
/tmp/a/b/c:
2.5 rmdir - 删除目录
功能:Remove Directory,删除空目录
语法:
bash
rmdir <dir-path>
示例:
bash
# 删除空目录
nsh> rmdir /tmp/test
nsh> ls /tmp
/tmp:
a/
# 删除非空目录会失败
nsh> rmdir /tmp/a
nsh: rmdir: '/tmp/a' is not empty
2.6 basename - 提取文件名
功能:提取路径中的文件名部分
语法:
bash
basename <path> [<suffix>]
示例:
bash
nsh> basename /tmp/test/file.txt
file.txt
nsh> basename /tmp/test/file.txt .txt
file
nsh> basename /tmp/test/
test
2.7 dirname - 提取目录路径
功能:提取路径中的目录部分
语法:
bash
dirname <path>
示例:
bash
nsh> dirname /tmp/test/file.txt
/tmp/test
nsh> dirname /tmp/test/
/tmp
三、文件操作命令
3.1 cat - 查看文件内容
功能:Concatenate,显示文件全部内容
语法:
bash
cat <path> [<path> ...]
示例:
bash
# 创建测试文件
nsh> echo "Hello NuttX!" > /tmp/hello.txt
# 查看文件内容
nsh> cat /tmp/hello.txt
Hello NuttX!
# 查看多个文件
nsh> cat /tmp/hello.txt /etc/passwd
Hello NuttX!
root:x:0:0:root:/:/bin/sh
3.2 touch - 创建或更新文件时间戳
功能:创建空文件或更新文件的访问/修改时间
语法:
bash
touch <path>
示例:
bash
# 创建空文件
nsh> touch /tmp/empty.txt
nsh> ls -l /tmp/empty.txt
-rw-r--r-- 1 0 0 0 /tmp/empty.txt
# 更新已存在文件的时间戳
nsh> touch /tmp/hello.txt
3.3 cp - 复制文件
功能:Copy,复制文件或目录
语法:
bash
cp [-f] <src-path> <dst-path>
参数说明:
| 参数 | 说明 |
|---|---|
-f |
强制覆盖目标文件 |
示例:
bash
# 复制文件
nsh> cp /tmp/hello.txt /tmp/hello_copy.txt
nsh> cat /tmp/hello_copy.txt
Hello NuttX!
# 复制到目录
nsh> mkdir /tmp/documents
nsh> cp /tmp/hello.txt /tmp/documents/
nsh> ls /tmp/documents/
/tmp/documents/:
hello.txt
3.4 mv - 移动或重命名文件
功能:Move,移动文件/目录或重命名
语法:
bash
mv <src-path> <dst-path>
示例:
bash
# 重命名文件
nsh> mv /tmp/hello.txt /tmp/greeting.txt
nsh> cat /tmp/greeting.txt
Hello NuttX!
# 移动文件到目录
nsh> mv /tmp/greeting.txt /tmp/documents/
nsh> ls /tmp/documents/
/tmp/documents/:
greeting.txt hello.txt
3.5 rm - 删除文件
功能:Remove,删除文件或目录
语法:
bash
rm [-f] [-r] <path>
参数说明:
| 参数 | 说明 |
|---|---|
-f |
强制删除,不提示 |
-r |
递归删除目录及其内容 |
示例:
bash
# 删除单个文件
nsh> rm /tmp/empty.txt
nsh> ls /tmp/empty.txt
nsh: ls: '/tmp/empty.txt': No such file or directory
# 强制删除
nsh> rm -f /tmp/nonexistent.txt
# 递归删除目录
nsh> rm -r /tmp/a
nsh> ls /tmp/a
nsh: ls: '/tmp/a': No such file or directory
3.6 ln - 创建链接
功能:Link,创建硬链接或符号链接
语法:
bash
ln [-s] <target> <link-name>
参数说明:
| 参数 | 说明 |
|---|---|
-s |
创建符号链接(软链接) |
示例:
bash
# 创建硬链接
nsh> ln /tmp/documents/greeting.txt /tmp/link_hard.txt
nsh> cat /tmp/link_hard.txt
Hello NuttX!
# 创建符号链接
nsh> ln -s /tmp/documents/greeting.txt /tmp/link_soft.txt
nsh> cat /tmp/link_soft.txt
Hello NuttX!
3.7 readlink - 读取符号链接
功能:显示符号链接指向的目标
语法:
bash
readlink <link-path>
示例:
bash
nsh> readlink /tmp/link_soft.txt
/tmp/documents/greeting.txt
四、文件内容查看命令
4.1 head - 查看文件开头
功能:显示文件的前几行
语法:
bash
head [-n <lines>] <path>
参数说明:
| 参数 | 说明 |
|---|---|
-n <lines> |
指定显示的行数,默认 10 行 |
示例:
bash
# 创建测试文件
nsh> for i in 1 2 3 4 5 6 7 8 9 10 11 12; do echo "Line $i" >> /tmp/test.txt; done
# 查看前 5 行
nsh> head -n 5 /tmp/test.txt
Line 1
Line 2
Line 3
Line 4
Line 5
4.2 tail - 查看文件结尾
功能:显示文件的最后几行
语法:
bash
tail [-n <lines>] [-f] <path>
参数说明:
| 参数 | 说明 |
|---|---|
-n <lines> |
指定显示的行数,默认 10 行 |
-f |
实时跟踪文件变化(跟随模式) |
示例:
bash
# 查看最后 3 行
nsh> tail -n 3 /tmp/test.txt
Line 10
Line 11
Line 12
# 实时跟踪(按 Ctrl+C 退出)
nsh> tail -f /tmp/test.txt
4.3 hexdump - 十六进制查看
功能:以十六进制和 ASCII 格式查看文件内容
语法:
bash
hexdump [-C] <path>
参数说明:
| 参数 | 说明 |
|---|---|
-C |
标准十六进制+ASCII 显示模式 |
示例:
bash
nsh> hexdump -C /tmp/hello_copy.txt
00000000 48 65 6c 6c 6f 20 4e 75 74 74 58 21 0a |Hello NuttX!.|
0000000d
4.4 xd - 十六进制转储
功能:另一种十六进制查看工具,功能类似 hexdump
语法:
bash
xd <path>
示例:
bash
nsh> xd /tmp/hello_copy.txt
0000: 48 65 6C 6C 6F 20 4E 75 74 74 58 21 0A Hello NuttX!.
五、文件属性操作命令
5.1 chmod - 修改文件权限
功能:Change Mode,修改文件权限位
语法:
bash
chmod <octal-mode> <path>
权限说明:
| 权限值 | 说明 |
|---|---|
755 |
所有者读写执行,其他用户读执行 |
644 |
所有者读写,其他用户只读 |
600 |
只有所有者读写 |
示例:
bash
# 查看当前权限
nsh> ls -l /tmp/hello_copy.txt
-rw-r--r-- 1 0 0 14 /tmp/hello_copy.txt
# 修改为 600(所有者读写)
nsh> chmod 600 /tmp/hello_copy.txt
nsh> ls -l /tmp/hello_copy.txt
-rw------- 1 0 0 14 /tmp/hello_copy.txt
# 修改为 755(所有者全部权限)
nsh> chmod 755 /tmp/hello_copy.txt
nsh> ls -l /tmp/hello_copy.txt
-rwxr-xr-x 1 0 0 14 /tmp/hello_copy.txt
5.2 chown - 修改文件所有者
功能:Change Owner,修改文件的所有者和组
语法:
bash
chown <uid>[:gid] <path>
示例:
bash
# 修改所有者为用户 1000
nsh> chown 1000 /tmp/hello_copy.txt
nsh> ls -l /tmp/hello_copy.txt
-rwxr-xr-x 1 1000 0 14 /tmp/hello_copy.txt
# 修改所有者和组
nsh> chown 1000:1000 /tmp/hello_copy.txt
nsh> ls -l /tmp/hello_copy.txt
-rwxr-xr-x 1 1000 1000 14 /tmp/hello_copy.txt
六、文件比较和搜索命令
6.1 cmp - 比较文件
功能:Compare,比较两个文件的内容
语法:
bash
cmp <file1> <file2>
示例:
bash
# 比较相同文件
nsh> cmp /tmp/hello_copy.txt /tmp/documents/greeting.txt
# 无输出表示相同
# 比较不同文件
nsh> touch /tmp/different.txt
nsh> cmp /tmp/hello_copy.txt /tmp/different.txt
/tmp/hello_copy.txt /tmp/different.txt differ: char 1, line 1
6.2 grep - 搜索文本
功能:Globally search a Regular Expression and Print,在文件中搜索匹配的文本
语法:
bash
grep <pattern> <path>
示例:
bash
# 在文件中搜索字符串
nsh> grep "NuttX" /tmp/hello_copy.txt
Hello NuttX!
# 在多个文件中搜索
nsh> grep "NuttX" /tmp/*.txt
/tmp/hello_copy.txt:Hello NuttX!
七、文件系统操作命令
7.1 mount - 挂载文件系统
功能:挂载文件系统到指定目录
语法:
bash
mount [-t <type>] <device> <mount-point>
常用文件系统类型:
| 类型 | 说明 |
|---|---|
tmpfs |
内存文件系统 |
romfs |
只读文件系统 |
fat |
FAT 文件系统 |
nxffs |
NuttX Flash 文件系统 |
binfs |
内置应用伪文件系统 |
hostfs |
宿主机文件系统(仅 SIM) |
示例:
bash
# 查看已挂载的文件系统
nsh> mount
/dev/ram0 on / type tmpfs (rw)
none on /proc type procfs (rw)
# 挂载 ROMFS
nsh> mount -t romfs /dev/rom0 /mnt/rom
# SIM 中挂载宿主机文件系统
nsh> mount -t hostfs /host /mnt/host
7.2 umount - 卸载文件系统
功能:Unmount,卸载已挂载的文件系统
语法:
bash
umount <mount-point>
示例:
bash
nsh> umount /mnt/host
nsh> mount
/dev/ram0 on / type tmpfs (rw)
none on /proc type procfs (rw)
7.3 df - 查看磁盘空间
功能:Disk Free,显示文件系统的磁盘使用情况
语法:
bash
df
示例:
bash
nsh> df
Filesystem Size Used Available Use% Mounted on
/dev/ram0 64.0M 12.3M 51.7M 19% /
none 0.0K 0.0K 0.0K 0% /proc
7.4 mkfatfs - 创建 FAT 文件系统
功能:在设备上创建 FAT 文件系统
语法:
bash
mkfatfs <device>
示例:
bash
# 创建 RAM 磁盘
nsh> mkrd /dev/ram1 1024
# 在 RAM 磁盘上创建 FAT 文件系统
nsh> mkfatfs /dev/ram1
# 挂载
nsh> mount -t fat /dev/ram1 /mnt/fat
7.5 mkrd - 创建 RAM 磁盘
功能:Make RAM Disk,创建 RAM 磁盘设备
语法:
bash
mkrd <device> <sectors>
参数说明:
| 参数 | 说明 |
|---|---|
<device> |
RAM 磁盘设备路径,如 /dev/ram1 |
<sectors> |
扇区数,每个扇区 512 字节 |
示例:
bash
# 创建 1MB 的 RAM 磁盘(2048 扇区 × 512 字节)
nsh> mkrd /dev/ram1 2048
7.6 losetup - 设置循环设备
功能:将文件关联到循环设备
语法:
bash
losetup <loop-device> <file>
示例:
bash
# 创建大文件
nsh> dd if=/dev/zero of=/tmp/disk.img bs=512 count=2048
# 设置循环设备
nsh> losetup /dev/loop0 /tmp/disk.img
# 创建文件系统
nsh> mkfatfs /dev/loop0
# 挂载
nsh> mount -t fat /dev/loop0 /mnt/loop
八、实战案例
8.1 案例一:文件管理综合练习
bash
# 1. 创建项目目录结构
nsh> mkdir -p /tmp/project/src /tmp/project/include /tmp/project/docs
# 2. 创建源文件
nsh> echo '#include <stdio.h>' > /tmp/project/src/main.c
nsh> echo 'int main() { printf("Hello NuttX!\n"); return 0; }' >> /tmp/project/src/main.c
# 3. 创建头文件
nsh> echo '#ifndef MAIN_H' > /tmp/project/include/main.h
nsh> echo '#define MAIN_H' >> /tmp/project/include/main.h
nsh> echo 'extern int main(void);' >> /tmp/project/include/main.h
nsh> echo '#endif' >> /tmp/project/include/main.h
# 4. 创建 README
nsh> echo 'NuttX Project' > /tmp/project/docs/README.txt
nsh> echo '=============' >> /tmp/project/docs/README.txt
nsh> echo 'A simple NuttX application' >> /tmp/project/docs/README.txt
# 5. 查看目录结构
nsh> ls -R /tmp/project
/tmp/project:
docs/ include/ src/
/tmp/project/docs:
README.txt
/tmp/project/include:
main.h
/tmp/project/src:
main.c
# 6. 查看文件内容
nsh> cat /tmp/project/src/main.c
#include <stdio.h>
int main() { printf("Hello NuttX!\n"); return 0; }
# 7. 复制文件
nsh> cp /tmp/project/docs/README.txt /tmp/project/README.txt
# 8. 移动文件
nsh> mv /tmp/project/README.txt /tmp/
# 9. 删除目录
nsh> rm -r /tmp/project
8.2 案例二:使用 RAM 磁盘
bash
# 1. 创建 2MB RAM 磁盘
nsh> mkrd /dev/ram1 4096
# 2. 创建 FAT 文件系统
nsh> mkfatfs /dev/ram1
# 3. 挂载到 /mnt/ramdisk
nsh> mount -t fat /dev/ram1 /mnt/ramdisk
# 4. 在 RAM 磁盘上创建文件
nsh> echo "Data on RAM disk" > /mnt/ramdisk/data.txt
nsh> cat /mnt/ramdisk/data.txt
Data on RAM disk
# 5. 查看磁盘使用情况
nsh> df
Filesystem Size Used Available Use% Mounted on
/dev/ram0 64.0M 12.3M 51.7M 19% /
none 0.0K 0.0K 0.0K 0% /proc
/dev/ram1 2.0M 16.0K 1.9M 1% /mnt/ramdisk
# 6. 卸载 RAM 磁盘
nsh> umount /mnt/ramdisk
8.3 案例三:SIM 中访问宿主机文件系统
bash
# 1. 挂载宿主机文件系统
nsh> mount -t hostfs /host /mnt/host
# 2. 查看宿主机目录
nsh> ls /mnt/host
# 会显示宿主机的根目录内容
# 3. 读取宿主机文件
nsh> cat /mnt/host/etc/hostname
myhost
# 4. 在宿主机上创建文件
nsh> echo "From NuttX SIM" > /mnt/host/tmp/nuttx.txt
# 5. 卸载
nsh> umount /mnt/host
九、文件系统结构
9.1 NuttX 默认文件系统布局
渲染错误: Mermaid 渲染失败: Lexical error on line 2. Unrecognized text. graph TD A/ --> Bdev/ A ---------------^
图 1: NuttX 默认文件系统布局
9.2 常用目录说明
| 目录 | 说明 |
|---|---|
/dev |
设备文件目录 |
/etc |
系统配置文件目录 |
/proc |
进程信息伪文件系统 |
/tmp |
临时文件目录(RAM) |
/usr |
用户程序和数据目录 |
/mnt |
挂载点目录 |
十、常见问题与解决方案
10.1 文件权限问题
问题:无法访问或修改文件
解决方案:
bash
# 查看文件权限
ls -l <path>
# 修改权限
chmod 644 <path>
chown <uid> <path>
10.2 文件系统满了
问题:写入文件时报错 "No space left on device"
解决方案:
bash
# 查看磁盘使用情况
df
# 删除不必要的文件
rm -rf /tmp/*
# 创建更大的 RAM 磁盘
mkrd /dev/ram1 8192
mkfatfs /dev/ram1
mount -t fat /dev/ram1 /mnt/large
10.3 无法挂载文件系统
问题:mount 命令失败
解决方案:
bash
# 检查设备是否存在
ls /dev/
# 检查挂载点是否存在
ls /mnt/
# 检查文件系统类型是否支持
# 在 menuconfig 中确保已启用对应的文件系统支持
10.4 符号链接无法工作
问题:访问符号链接时报错
解决方案:
bash
# 检查符号链接目标是否存在
readlink <link-path>
# 重新创建符号链接
rm <link-path>
ln -s <target> <link-path>
结束语
NuttX NSH 提供了一套完整的文件和目录操作命令,这些命令与 Linux shell 命令非常相似,易于上手。通过本文的介绍,相信你已经掌握了在 NuttX 中进行文件管理的基本技能。
在实际开发中,合理使用这些命令可以帮助你高效地管理嵌入式系统中的文件和目录。建议在 SIM 模拟器中多练习,熟悉各种命令的用法和参数,为实际硬件开发打下坚实基础。
参考资料:
如果你觉得这篇文章对你有帮助,欢迎点赞、收藏和评论!如果有任何问题或建议,也欢迎在评论区留言讨论。