NuttX命令行文件和目录操作完全指南

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)
cdcd ~ 切换到 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!

功能:显示符号链接指向的目标

语法

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 模拟器中多练习,熟悉各种命令的用法和参数,为实际硬件开发打下坚实基础。


参考资料


如果你觉得这篇文章对你有帮助,欢迎点赞、收藏和评论!如果有任何问题或建议,也欢迎在评论区留言讨论。