Java 获取linux根目录下的文件夹_「正点原子Linux连载」第二章Ubuntu系统入门(2)...

1)实验平台:正点原子Linux开发板

2)摘自《正点原子I.MX6U嵌入式Linux驱动开发指南

关注官方微信号公众号,获取更多资料:正点原子

911a5a54ab4bb65037e0954dc3d0e517.png

2.6 Linux文件系统

操作系统的基本功能之一就是文件管理,而文件的管理是由文件系统来完成的。Linux支持多种文件系统,本节我们就来讲解Linux下的文件系统、文件系统类型、文件系统结构和文件系统相关Shell命令。

2.6.1 Linux文件系统简介以及类型

1、Linux文件系统简介

操作系统就是处理各种数据的,这些数据在硬盘上就是二进制,人类肯定不能直接看懂这些二进制数据,要有一个翻译器,将这些二进制的数据还原为人类能看懂的文件形式,这个工作就是由文件系统来完成的,文件系统的目的就是实现数据的查询和存储,由于使用场合、使用环境的不同,Linux有多种文件系统,不同的文件系统支持不同的体系。文件系统是管理数据的,而可以存储数据的物理设备有硬盘、U盘、SD卡、NAND FLASH、NOR FLASH、网络存储设备等。不同的存储设备其物理结构不同,不同的物理结构就需要不同的文件系统去管理,比如管理NAND FLASH的话使用YAFFS文件系统,管理硬盘、SD卡的话就是ext文件系统等等。

我们在使用Windows的时候新买一个硬盘回来一般肯定是将这个硬盘分为好几个盘,比如C盘、D盘等等。这个叫磁盘的分割,Linux下也支持磁盘分割,Linux下常用的磁盘分割工具为:fdisk,fdisk这个工具我们后面会详细讲解怎么用,因为我们移植Linux的时候需要将SD卡分为三个分区来存储不同的东西。在Windows下我们创建一个新的盘符以后都要做格式化处理,格式化其实就是给这个盘符创建文件系统的过程,我们在Windows格式化某个盘的时候都会让你选择文件系统,如图2.6.1.1所示:

d062ccffcc819068a6adde0cb11a03ea.png

图2.6.1.1格式化磁盘

图2.6.1.1就是格式化磁盘的时候选择文件系统,Windows下一般有FAT、NTFS和exFAT这些文件系统。同样的,在Linux下我们使用fdisk创建好分区以后也是要先在创建好的分区上面创建文件系统,也就是格式化。

在Windows下有磁盘分区的概念,比如C,D,E盘等,在Linux下没有这个概念,因此Linux下你找不到像C、D、E盘这样的东西。前面我们说了Linux下可以给磁盘分割,但是没有C、D、E盘那怎么访问这些分区呢?在Linux下创建一个分区并且格式化好以后我们要将其“挂载”到一个目录下才能访问这个分区。W indows的文件系统挂载过程是其内部完成的,用户是看不到的,Linux下我们使用mount命令来挂载磁盘。挂载磁盘的时候是需要确定挂载点的,也就是你的这个磁盘要挂载到哪个目录下。

2、Linux文件系统类型

前面我们说了,在Windows下有FAT、NTFS和exFAT这样的文件系统,在Linux下又有哪些文件系统呢,Linux下的文件系统主要有ext2、ext3、ext4等文件系统。Linux还支持其他的UNIX文件系统,比如XFS、JFS、UFS等,也支持Windows的FAT文件系统和网络文件系统NFS等。这里我们主要讲一下Linux自带的ext2、ext3和ext4文件系统。

ext2文件系统:

ext2是Linux早期的文件系统,但是随着技术的发展ext2文件系统已经不推荐使用了,ext2是一个非日志文件系统,大多数的Linux发行版都不支持ext2文件系统了。

ext3文件系统:

ext3是在ext2的基础上发展起来的文件系统,完全兼容ext2文件系统,ext3是一个日志文件系统,ext3支持大文件,ext3文件系统的特点有如下:

高可靠性:使用ext3文件系统的话,即使系统非正常关机、发生死机等情况,恢复ext3文件系统也只需要数十秒。

数据完整性:ext3提高了文件系统的完整性,避免意外死机或者关机对文件系统的伤害。

文件系统速度:ext3的日志功能对磁盘驱动器读写头进行了优化,文件系统速度相对与ext2来说没有降低。

数据转换:从ext2转换到ext3非常容易,只需要两条指令就可以完成转换。用户不需要花时间去备份、恢复、格式化分区等,用ext3文件系统提供的工具tune2fs即可轻松的将ext2文件系统转换为ext3日志文件系统。ext3文件系统不需要经过任何修改,可以直接挂载成ext2文件系统。

ext4文件系统:

ext4文件系统是在ext3上发展起来的,ext4相比与ext3提供了更佳的性能和可靠性,并且功能更丰富,ext4向下兼容ext3和ext2,因此可以将ext2和ext3挂载为ext4。那么我们安装的Ubuntu使用的哪个版本的文件系统呢?在终端中输入如下命令来查询当前磁盘挂载的啥文件系统:

df -T –h

254ccdb7bbd5ea468d9ae8abaccb793c.png

结果如图2.6.1.2所示:

图2.6.1.2 Ubuntu使用的文件系统

在图2.6.1.2中,框起来的就是我们安装Ubuntu的这个磁盘,在Linux下一切皆为文件,“/dev/sda1”就是我们的磁盘分区,可以看出这个磁盘分区类型是ext4,它的挂载点是“/”,也就是根目录。

2.6.2 Linux文件系统结构

在Windows下直接打开C盘,我们进入的就是C盘的根目录,打开D盘进入的就是D盘的根目录,比如C盘根目录如下:

ec7110098244e282ae537dd322b9bde3.png

图2.6.2.1 C盘根目录

在Linux下因为没有C、D盘之说,因此Linux只有一个根目录,没有C盘根目录、D盘根目录之类的。其实如果你的Windows只有一个C盘的话那么整个系统也就只有一个根目录。

Windows下的C盘根目录就是“C:”,在Linux下的根目录就是“/”,你没有看错,Linux根目录就是用“/”来表示的,打开Ubuntu的文件浏览器,文件浏览器在左侧的导航栏,图标如图2.6.2.2所示:

b84722ac70923e1fa3d679439d7dd378.png

图2.6.2.2文件浏览器

打开以后的文件浏览器如图2.6.2.3所示:

ee0d00e796e1c82c2841ff778f7bac1a.png

图2.6.2.3文件浏览器

直接打开文件浏览器以后,我们默认不是处于根目录中的,不像Windows,我们直接打开C盘就处于C盘根目录下。Ubuntu是支持多用户的,Ubuntu为每个用户创建了一个根目录,比如我电脑现在登陆的是“zuozhongkai”这个用户,因此默认进入的是“zuozhongkai”这个用户的根目录。我们点击图2.6.2.3中左侧的“计算机”,打开以后如图2.6.2.4所示:

0d02b3aa611fe29a6decbbfb6c8a7ecf.png

图2.6.2.4根目录“/”

图2.6.2.4就是Ubuntu的根目录“/”,这时候肯定就有人有疑问,刚刚说Ubuntu会给每个用户创建一个根目录,那这些用户的根目录在哪里?是不是和根目录“/”是一个地位的?其实所谓的给每个用户创建一个根目录只是方便说而已,这个所谓的用户根目录其实就是“/”下的一个文件夹,以我的“zuozhongkai”这个用户为例,其用户根目录就是:/home/zuozhongkai。只要你创建了一个用户,那么系统就会在/home这个目录下创建一个以这个用户名命名的文件夹,这个文件夹就是这个用户的根目录。

用户可以对自己的用户根目录下的文件进行随意的读写操作,但是如果要修改根目录“/”下的文件就会提示没有权限。打开终端以后默认进入的是当前用户根目录,比如我们打开终端以后输入“ls”命令查看当前目录下有什么文件,结果如图2.6.2.5所示:

a542df862721cd5c3852684bf9488e59.png

图2.6.2.5目录查看

可以看出图2.6.2.5中的文件和图2.6.2.3中的一模一样,都是“zuozhongkai”这个账户的根目录。我们来看一下根目录“/”下都有哪些文件,在终端中输入如下命令:

cd / //进入到根目录“/

ls //查看根目录“/”下的文件以及文件夹

执行上述两行命令以后,终端如图2.6.2.6所示:

01930e0de89388e41e96259b1166ff3b.png

图2.6.2.6查看根目录“/”

图2.6.2.6中列举出了根目录“/”下面的所有文件夹,这里我们仔细观察一下,当我们进入到根目录“/”里面以后终端提示符“$”前面的符号“~”变成了“/”,这是因为当我们在终端中切换了目录以后“$”前面就会显示切换以后的目录路径。我们来看一下根目录“/”中的一些重要的文件夹:

/bin 存储一些二进制可执行命令文件,/usr/bin也存放了一些基于用户的命令文件。

/sbin 存储了很多系统命令,/usr/sbin也存储了许多系统命令。

/root 超级用户root的根目录文件。

/home 普通用户默认目录,在该目录下,每个用户都有一个以本用户名命名的文件夹。

/boot 存放Ubuntu系统内核和系统启动文件。

/mnt 通常包括系统引导后被挂载的文件系统的挂载点。

/dev 存放设备文件,我们后面学习Linux驱动主要是跟这个文件夹打交道的。

/etc 保存系统管理所需的配置文件和目录。

/lib 保存系统程序运行所需的库文件,/usr/lib下存放了一些用于普通用户的库文件。

/lost+found 一般为空,当系统非正常关机以后,此文件夹会保存一些零散文件。

/var 存储一些不断变化的文件,比如日志文件

/usr 包括与系统用户直接有关的文件和目录,比如应用程序和所需的库文件。

/media 存放Ubuntu系统自动挂载的设备文件。

/proc 虚拟目录,不实际存储在磁盘上,通常用来保存系统信息和进程信息。

/tmp 存储系统和用户的临时文件,该文件夹对所有的用户都提供读写权限。

/opt 可选文件和程序的存放目录。

/sys 系统设备和文件层次结构,并向用户程序提供详细的内核数据信息。

2.6.2文件操作命令

本节我们来学习一下在终端进行文件操作的一些常用命令:

1、创建新文件命令—touch

在前面学习VIM的时候我们知道可以用vi指令来创建一个文本文档,本节我们就学习一个功能更全面的文件创建命令—touch。touch不仅仅可以用用来创建文本文档,其它类型的文档也可以创建,命令格式如下:

touch [参数] [文件名]

使用touch创建文件的时候,如果[文件名]的文件不存在,那就直接创建一个以[文件名]命名的文件,如果[文件名]文件存在的话就仅仅修改一下此文件的最后修改日期,常用的命令参数如下:

-a 只更改存取时间。

-c 不建立任何文件。

-d 使用指定的日期,而并非现在日期。

-t 使用指定的时间,而并非现在时间。

进入到用户根目录下,直接使用命令“cd ~”即可快速进入用户根目录,进入用户根目录以后使用touch命令创建一个名为test的文件,创建过程如图2.6.2.1所示:

图2.6.2.1touch命令操作

da215708b579210a452af2e5f3e3d8d3.png

2、文件夹创建命令—mkdir

既然可以创建文件,那么肯定也可以创建文件夹,创建文件夹使用命令“mkdir”,命令格式如下:

mkdir [参数] [文件夹名目录名]

主要参数如下:

-p 如所要创建的目录其上层目录目前还未创建,那么会一起创建上层目录。

我们在用户根目录下创建两个分别名为“testdir1”和“testdir2”的文件夹,操作如图2.6.2.2所示:

af73695632d86bfb93596b9fe1b3d562.png

图2.6.2.2创建文件夹

在图2.6.2.2中,我们使用命令“mkdir”创建了“testdir1”和“testdir2”这两个文件夹。

3、文件及目录删除命令—rm

既然有创建文件的命令,那肯定有删除文件的命令,要删除一个文件或者文件夹可以使用命令“rm”,此命令可以完成删除一个文件或者多个文件及文件夹,它可以实现递归删除。对于链接文件,只删除链接,原文件保持不变,所谓的链接文件,其实就是Windows下的快捷方式文件,此命令格式如下:

rm [参数] [目的文件或文件夹目录名]

命令主要参数如下:

-d 直接把要删除的目录的硬连接数据删成0,删除该目录。

-f 强制删除文件和文件夹(目录)。

-i 删除文件或者文件夹(目录)之前先询问用户。

-r 递归删除,指定文件夹(目录)下的所有文件和子文件夹全部删除掉。

-v 显示删除过程。

我们使用rm命令来删除前面使用命令“touch”创建的test文件,操作过程如图2.6.2.3所示:

5655ccb050aaa110927748ba4c32564c.png

图2.6.2.3删除文件

命令“rm”也可以直接删除文件夹,我们可以试一下删除前面创建的testdir1文件夹,先直接使用命令“rmtestdir1”测试一下是否可以删除,结果如图2.6.2.4所示:

a8431766cc191dfb4be80e750bbfbcf1.png

图2.6.2.4删除文件夹

在图2.6.2.4中可以看出,直接使用命令“rm”是无法删除文件夹(目录)的,我们需要加上参数“-rf”,也就是强制递归删除文件夹(目录),操作结果如图2.6.2.5所示:

93d219b3fe1a57a58527bebe6bc612b0.png

图2.6.2.5带参数删除文件夹

从图2.6.2.5可以看出,当在命令“rm”中加入参数“-rf”以后就可以删除掉文件夹“testdir1”了。

4、文件夹(目录)删除命令—rmdir

上面我们讲解了如何使用命令“rm”删除文件夹,那就是要加上参数“-rf”,其实Linux提供了直接删除文件夹(目录)的命令—rmdir,它可以不加任何参数的删除掉指定的文件夹(目录),命令格式如下:

rmdir[参数][文件夹(目录)]

命令主要参数如下:

-p 删除指定的文件夹(目录)以后,若上层文件夹(目录)为空文件夹(目录)的话就将其一起删除。

我们使用命令“rmdir”删除掉前面创建的“testdir2”文件夹,操作过程如图2.6.2.6所示:

5516a2b6a987bd268871b46930f6f6a0.png

图2.6.2.6命令rmdir删除文件夹

5、文件复制命令—cp

在Windows下我们可以通过在文件上点击鼠标右键来进行文件的复制和粘贴,在Ubuntu下我们也可以通过点击文件右键进行文件的复制和粘贴。但是本节我们来讲解如何在终端下使用命令来进行文件的复制,Linux下的复制命令为“cp”,命令描述如下:

cp [参数] [源地址] [目的地址]

主要参数描述如下:

-a 此参数和同时指定“-dpR”参数相同

-d 在复制有符号连接的文件时,保留原始的连接。

-f 强行复制文件,不管要复制的文件是否已经存在于目标目录。

-I 覆盖现有文件之前询问用户。

-p 保留源文件或者目录的属性。

-r或-R 递归处理,将指定目录下的文件及子目录一并处理

我们在用户根目录下,使用前面讲解的命令“mkdir”创建两个文件夹:test1和test2,过程如图2.6.2.7所示。

66f1489303f7c43b5aba1488db6d17b8.png

图2.6.2.7 创建test1和test2两个文件夹

进入上面创建的test1文件夹,然后在test1文件夹里面创建一个a.c文件,操作过程如图2.6.2.8所示:

217ed69925bbee879f1b15bb118ce524.png

图2.6.2.8 创建a.c文件

我们先将图2.6.2.8中的a.c这个文件做个备份,也就是复制到同文件夹test1里面,新的文件命名为b.c。然后在将test1文件夹中的a.c和b.c这两个文件都复制到文件夹test2中,操作如图2.6.2.9所示

d72673f81882e60484ab9dfef909f26d.png

图2.6.2.9 拷贝文件

在图2.6.2.9中,我们添加了一些高级使用技巧,首先是拷贝a.c和b.c文件到test2文件夹中,我们使用了通配符“*”,“*.c”就表示test1下的所有以“.c”结尾的文件,也就是a.c和b.c。“../test2”中的“../”表示上级目录,因此“../test2”就是上级目录下的test2文件夹。

上面都是文件复制,我们接下来学习一下文件夹复制,我们将test2文件夹复制到同目录下,新拷贝的文件夹命名为test3,操作如图2.6.2.10所示:

0dbc93f7dcc5e5468d1979c58b5dfaef.png

图2.6.2.10拷贝文件夹

6、文件移动命令—mv

有时候我们需要将一个文件或者文件夹移动到另外一个地方去,或者给一个文件或者文件夹进行重命名,这个时候我们就可以使用命令“mv”了,此命令格式如下:

mv [参数] [源地址] [目的地址]

主要参数描述如下:

-b 如果要覆盖文件的话覆盖前先进行备份。

-f 若目标文件或目录与现在的文件重复,直接覆盖目的文件或目录。

-I 在覆盖之前询问用户。

使用上面讲解“cp”命令的时候创建了三个文件夹,在上面创建的test1文件夹里面创建一个c.c文件,然后将c.c这个文件重命名为d.c。最后将d.c这个文件移动到test2文件夹里面,操作如图2.6.2.11所示:

8591a17834b06cba3b1dc369affb550c.png

图2.6.2.11移动文件操作

我们再将test1中的d.c文件移动到test2文件夹里面,操作如图2.6.2.12所示:

871367fcfb8ad20b40c92b23463057df.png

图2.6.2.12移动文件操作

2.6.3文件压缩和解压缩

文件的压缩和解压缩是非常常见的操作,在Windows下我们有很多压缩和解压缩的工具,比如zip、360压缩等等。在Ubuntu下也有压缩工具,本节我们学习Ubuntu下图形化以及命令行这两种压缩和解压缩操作。

1、图形化压缩和解压缩

图形化压缩和解压缩和Windows下基本一样,在要压缩或者解压的文件上点击鼠标右键,然后选择要进行的操作,我们先讲解一下如何进行文件的压缩。首先找到要压缩的文件,然后在要压缩的文件上点击鼠标右键,选择“压缩”选项,如图2.6.3.1所示:

c69689879c5146c20edb238fb32ffc8f.png

图2.6.3.1文件压缩

在图2.6.3.1中我们要对test2这个文件夹进行压缩,点击“压缩”以后会弹出图2.6.3.2所示界面让选择压缩后的文件名和压缩格式。

97e519f5969db8e223e7b78fb4855cb8.png

图2.6.3.2压缩命名和格式选择

在图2.6.3.2中,设置好压缩以后的文件名,然后选择压缩格式,可选的压缩格式如图2.6.3.3所示:

173f4ed076753bc812bd44bcc9e24023.png

图2.6.3.3可选压缩格式

从图2.6.3.3中可以看出,可以选择的压缩格式还是有很多的,挑选一个格式进行压缩,比如我选择的“.zip”这个格式,压缩完成以后如图2.6.3.4所示:

263489ab0ca588a2f2907964add1a0f2.png

图2.6.3.4压缩完成的文件

上面就是使用图形化进行文件压缩的过程,我们接下来对刚刚压缩的test2.zip进行解压缩,鼠标放到test2.zip上然后点击鼠标右键,选择“提取到此处”,如图2.6.3.5所示:

e3e83a2f4f5a73a09a1a61222405da85.png

图2.6.3.5解压缩文件

点击图2.6.3.5中的“提取到此处”以后,系统就会自动进行解压缩,上面就是在Ubuntu中使用图形化工具进行文件的压缩和解压缩。

2、命令行进行文件的压缩和解压缩

上面我们学习了如何使用图形化工具在Ubuntu下进行文件的压缩和解压缩,本节我们学学如何使用命令行进行压缩和解压缩,我们后面的开发中所有涉及到压缩和解压缩的操作都是在命令行下完成的。命令行下进行压缩和解压缩常用的命令有三个:zip、unzip和tar,我们依次来学习:

、命令zip

zip命令看名字就知道是针对.zip文件的,用于将一个或者多个文件压缩成一个.zip结尾的文件,命令格式如下:

zip [参数] [压缩文件名.zip] [被压缩的文件]

主要参数函数如下:

-b 指定暂时存放文件的目录。

-d 从 zip 文件中删除一个文件。

-F 尝试修复已经损毁的压缩文件。

-g 将文件压缩入现有的压缩文件中,不需要新建压缩文件。

-h 帮助。

-j 只保存文件的名,不保存目录。

-m 压缩完成以后删除源文件。

-n 不压缩特定扩展名的文件。

-q 不显示压缩命令执行过程。

-r 递归压缩,将指定目录下的所有文件和子目录一起压缩。

-v 显示指令执行过程。

-num 压缩率,为1~9的数值。

上面讲解了如何使用图形化压缩工具对文件夹test2进行压缩,这里我们使用命令“zip”对test2文件夹进行压缩,操作如图2.6.3.6所示:

6c5cefd6ea136f98308926c3239ec2f6.png

图2.6.3.6使用zip进行文件压缩

图2.6.3.6就是使用zip命令进行test2文件夹的压缩,我们使用的命令如下:

zip -rv test2.zip test2

上述命令中,-rv表示递归压缩并且显示压缩命令执行过程。

命令unzip

unzip命令用于对.zip格式的压缩包进行解压,命令格式如下:

unzip [参数] [压缩文件名.zip]

主要参数如下:

-l 显示压缩文件内所包含的文件。

-t 检查压缩文件是否损坏,但不解压。

-v 显示命令显示的执行过程。

-Z 只显示压缩文件的注解。

-C 压缩文件中的文件名称区分大小写。

-j 不处理压缩文件中的原有目录路径。

-L 将压缩文件中的全部文件名改为小写。

-n 解压缩时不要覆盖原有文件。

-P 解压密码。

-q 静默执行,不显示任何信息。

-x 指定不要处理.zip中的哪些文件。

-d 把压缩文件解到指定目录下。

对上面压缩的test2.zip文件使用unzip命令进行解压缩,操作如图2.6.3.7所示:

8195ae6d01406a9915dadc2786611efc.png

图2.6.3.7命令unzip使用演示

、命令tar

我们前面讲的zip和unzip这两个是命令只适用于.zip格式的压缩和解压,其它压缩格式就用不了了,比如Linux下最常用的.bz2和.gz这两种压缩格式。其它格式的压缩和解压使用命令tar,tar将压缩和解压缩集合在一起,使用不同的参数即可,命令格式如下:

tar [参数] [压缩文件名] [被压缩文件名]

常用参数如下:

-c 创建新的压缩文件。

-C 切换到指定的目录。

-f 指定压缩文件。

-j 用tar生成压缩文件,然后用bzip2进行压缩。

-k 解开备份文件时,不覆盖已有的文件。

-m 还原文件时,不变更文件的更改时间。

-r 新增文件到已存在的备份文件的结尾部分。

-t 列出备份文件内容。

-v 显示指令执行过程。

-w 遭遇问题时先询问用户。

-x 从备份文件中释放文件,也就是解压缩文件。

-z 用tar生成压缩文件,用gzip压缩。

-Z 用tar生成压缩文件,用compress压缩。

使用tar命令来进行.zip和.gz格式的文件压缩,操作如图2.6.3.8所示:

4ee189e25906af09a14067f362a23688.png

图2.6.3.8tar命令进行压缩

在图2.6.3.8中,我们使用如下两个命令将test1文件夹压缩为.bz2和.gz这两个格式:

tar -vcjf test1.tar.bz2 test1

tar -vczf test1.tar.gz test1

在上面两行命令中,-vcjf表示创建bz2格式的压缩文件,-vczf表示创建.gz格式的压缩文件。学习了如何使用tar命令来完成压缩,我们再来学习使用tar命令完成文件的解压,操作如图2.6.3.9所示:

5220cadc7a513c9ef03230b677075268.png

图2.6.3.9tar解压缩命令

图2.6.3.9中我们使用如下所示两行命令完成.bz2和.gz格式文件的解压缩:

tar -vxjf test1.tar.bz2

tar -vxzf test2.tar.gz

上述两行命令中,-vxjf用来完成.bz2格式压缩文件的解压,-vxzf用来完成.gz格式压缩文件的解压。关于Ubuntu下的命令行压缩和解压缩就讲解到这里,重点是tar命令,要熟练掌握使用tar命令来完成.bz2和.gz格式的文件压缩和解压缩。

2.6.4文件查询和搜索

文件的查询和搜索也是最常用的操作,在嵌入式Linux开发中常常需要在Linux源码文件中查询某个文件是否存在,或者搜索哪些文件都调用了某个函数等等。本节我们就讲解两个最常用的文件查询和搜索命令:find和grep。

1、命令find

find命令用于在目录结构中查找文件,其命令格式如下:

find [路径] [参数] [关键字]

路径是要查找的目录路径,如果不写的话表示在当前目录下查找,关键字是文件名的一部分,主要参数如下:

-name按照文件名称查找,查找与filename匹配的文件,可使用通配符。

-depth 从指定目录下的最深层的子目录开始查找。

-gid 查找符合指定的群组识别码的文件或目录。

-group 查找符合指定的群组名称的文件或目录。

-size 查找符合指定文件大小的文件。

-type 查找符合指定文件类型的文件。

-user 查找符合指定的拥有者名称的文件或目录。

find命令的参数有很多,常用的就这些,关于其它的参数大家可以自行上网查找,我们来看一下如何使用find命令进行文件搜索,我们搜索目录/etc中以“vim”开头的文件为例,操作如图2.6.4.1所示:

8ddb2a59f21c41a29745b637e6903634.png

图2.6.4.1find命令操作

从图2.6.4.1可以看出,在目录/etc下,包含以“vim*”开头的文件有/etc/vim、/etc/vim/vimrc等等,就不一一列出了。

2、命令grep

find命令用于在目录中搜索文件,我们有时候需要在文件中搜索一串关键字,grep就是完成这个功能的,grep命令用于查找包含指定关键字的文件,如果发现某个文件的内容包含所指定的关键字,grep命令就会把包含指定关键字的这一行标记出来,grep命令格式如下:

grep [参数] 关键字 文件列表

grep命令一次只能查一个关键字,主要参数如下:

-b 在显示符合关键字的那一列前,标记处该列第1个字符的位编号。

-c 计算符合关键字的列数。

-d 当指定要查找的是目录而非文件时,必须使用此参数!否则grep指令将回报信息并停止搜索。

-i 忽略字符大小写。

-v 反转查找,只显示不匹配的行。

-r 在指定目录中递归查找。

比如我们在目录/usr下递归查找包含字符“Ubuntu”的文件,操作如图2.6.4.2所示:

d89893ffa8e7a9a4bbef6efdb3aea4bc.png

图2.6.4.2命令grep演示

2.6.5文件类型

这里的文件类型不是说这个文件是音乐文件还是文本文件,在用户根目录下使用命令“ls -l”来查看用户根目录下所有文件的详细信息,如图2.6.5.1所示:

2267ffd94c16982617950d3fd0bab80f.png

图2.6.5.1文件详细信息

在图2.6.5.1中,每个文件的详细信息占一行,每行最前面都是一个符号就标记了当前文件类型,比如test1的第一个字符是“d”,test1.tar.bz2文件第一个字符是“-”。这些字符表示的文件类型如下:

- 普通文件,一些应用程序创建的,比如文档、图片、音乐等等。

d 目录文件。

c 字符设备文件,Linux驱动里面的字符设备驱动,比如串口设备,音频设备等。

b 块设备文件,存储设备驱动,比如硬盘,U盘等。

l 符号连接文件,相当于Windwos下的快捷方式。

s 套接字文件。

p 管道文件,主要指FIFO文件。

我们后面学习Linux驱动开发的时候基本是在和字符设备文件和块设备文件打交道。

2.7 Linux用户权限管理

2.7.1Ubuntu用户系统

Ubuntu是一个多用户系统,我们可以给不同的使用者创建不同的用户账号,每个用户使用各自的账号登陆,使用用户账号的目的一是方便系统管理员管理,控制不同用户对系统的访问权限,另一方面是为用户提供安全性保护。

我们前面在安装Ubuntu系统的时候被要求创建一个账户,当我们创建好账号以后,系统会在目录/home下以该用户名创建一个文件夹,所有与该用户有关的文件都会被存储在这个文件文件夹中。同样的,创建其它用户账号的时候也会在目录/home下生成一个文件夹来存储该用户的文件,图2.7.1.1就是我的电脑上“zuozhongkai”这个账户的文件夹。

1f32c0a4692042415a76ae8503099850.png

图2.7.1.1用户账号根目录

装系统的时候创建的用户其权限比后面创建的用户大一点,但是没有root用户权限大,Ubuntu下用户类型分为以下3类:

●初次创建的用户,此用户可以完成比普通用户更多的功能。

●root用户,系统管理员,系统中的玉皇大帝,拥有至高无上的权利。

● 普通用户,安装完操作系统以后被创建的用户。

以上三种用户,每个用户都有一个ID号,称为UID,操作系统通过UID来识别是哪个用户,用户相关信息可以在文件/etc/passwd中查看到,如图2.7.1.2所示:

5e47274ea4f37fbed64b408cfaed1610.png

图2.7.1.2passwd文件内容

从配置文件passwd中可以看到,每个用户名后面都有两个数字,比如用户“zuozhongkai”后面“1000:1000”,第一个数字是用户的ID,另一个是用户的GID,也就是用户组ID。Ubuntu里面每个用户都属于一个用户组里面,用户组就是一组有相同属性的用户集合。

2.7.2权限管理

在使用Windows的时候我们很少接触到用户权限,最多就是打开某个软件出问题的时候会选择以“管理员身份”打开。Ubuntu下我们会常跟用户权限打交道,权限就是用户对于系统资源的使用限制情况,root用户拥有最大的权限,可以为所欲为,装系统的时候创建的用户拥有root用户的部分权限,其它普通用户的权限最低。对于我们做嵌入式开发的人一般不关注用户的权限问题,因为嵌入式基本是单用户,做嵌入式开发重点关注的是文件的权限问题。

对于一个文件通常有三种权限:读(r)、写(w)和执行(x),使用命令“ls -l”可以查看某个目录下所有文件的权限信息,如图2.7.2.1所示:

2e454c5263670eb52175b39a947ef78e.png

图2.7.2.1文件权限信息

在图2.7.2.1中我们以文件test.c为例讲解,文件test.c文件信息如下:

-rw-rw-r-- 1 zuozhongkai zuozhongkai 0 12月 25 20:44 test.c

其中“-rw-rw-r--”表示文件权限与用户和用户组之间的关系,第一位表示文件类型,上一小节已经说了。剩下的9位以3位为一组,分别表示文件拥有者的权限,文件拥有者所在用户组的权限以及其它用户权限。后面的“zuozhongkaizuozhongkai”分别代表文件拥有者(用户)和该用户所在的用户组,因此文件test.c的权限情况如下:

、文件test.c的拥有者是用户zuozhongkai,其对文件tesst.c的权限是“rw-”,也就是对该文件拥有读和写两种权限。

、用户zuozhongkai所在的用户组也叫做zuozhongkai,其组内用户对于文件test.c的权限是“rw-”,也是拥有读和写这两种权限。

、其它用户对于文件test.c的权限是“r--”,也就是只读权限。

对于文件,可读权限表示可以打开查看文件内容,可写权限表示可以对文件进行修改,可执行权限就是可以运行此文件(如果是软件的话)。对于文件夹,拥有可读权限才可以使用命令ls查看文件夹中的内容,拥有可执行权限才能进入到文件夹内部。

如果某个用户对某个文件不具有相应的权限的话就不能进行相应的操作,比如根目录“/”下的文件只有root用户才有权限进行修改,如果以普通用户去修改的话就会提示没有权限。比如我们要在根目录“/”创建一个文件mytest,使用命令“touchmytest”,结果如图2.7.2.2所示:

c64fd4927ee3cbaaeb7dbf4162454dd1.png

图2.7.2.2创建文件

在图2.7.2.2中,我以用户“zuozhongkai”在根目录“/”创建文件mytest,结果提示我无法创建“mytest”,因为权限不够,因为只有root用户才能在根目录“/”下创建文件。我们可以使用命令“sudo”命令暂时切换到root用户,这样就可以在根目录“/”下创建文件mytest了,如图2.7.2.3所示:

db6a6318a181f3e1f6193cf320124e3d.png

图2.7.2.3使用sudo命令创建文件

在图2.7.2.3中我们使用命令“sduo”以后就可以在根目录“/”创建文件mytest,在进行其它的操作的时候,遇到提示权限不够的时候都可以使用sudo命令暂时以root用户身份去执行。

上面我们讲了,文件的权限有三种:读(r)、写(w)和执行(x),除了用r、w和x表示以外,我们也可以使用二进制数表示,三种权限就可以使用3位二进制数来表示,一种权限对应一个二进制位,如果该位为1就表示具备此权限,如果该位为0就表示没不具备此权限,如表2.7.2.1所示:

7983a5448086e0f289dfa1cc0b265bc1.png

表2.7.2.1文件权限数字表示方法

如果做过单片机开发的话,就会发现和单片机里面的寄存器位一样,将三种权限r、w和x进行不同的组合,即可得到不同的二进制数和八进制数,3位权限可以组出8种不同的权限组合,如表2.7.2.2所示:

ff2e0897cae9c7ebf523ab2b58a51912.png
2cd65b919f6858c9ef94323a8c619ec1.png

表2.7.2.2文件所有权限组合

表2.7.2.2中权限所对应的八进制数字就是每个权限对应的位相加,比如权限rwx就是4+2+1=7。前面的文件test.c其权限为“rw-rw-r--”,因此其十进制表示就是:664。

另外我们也开始使用a、u、g和o表示文件的归属关系,用=、+和-表示文件权限的变化,如表2.7.2.3所示:

ca00cc7ab51add49acd2969030fac397.png

表2.7.2.3权限修改字母表示方式

对于文件test.c,我们想要修改其归属用户(zuozhongkai)对其拥有可执行权限,那么就可以使用:u+x。如果希望设置归属用户及其所在的用户组都对其拥有可执行权限就可以使用:gu+x。

2.7.3权限管理命令

我们也可以使用Shell来操作文件的权限管理,主要用到“chmod”和“chown”这两个命令,我们一个一个来看。

1、权限修改命令chmod

命令“chmod”用于修改文件或者文件夹的权限,权限可以使用前面讲的数字表示也可以使用字母表示,命令格式如下:

chmod [参数] [文件名/目录名]

主要参数如下:

-c 效果类似“-v”参数,但仅回显更改的部分。

-f 不显示错误信息。

-R 递归处理,指定目录下的所有文件及其子文件目录一起处理。

-v 显示指令的执行过程。

我们先来学习以下如何使用命令“chmod”修改一个文件的权限,在用户根目录下创建一个文件test,然后查看其默认权限,操作如图2.7.3.1所示:

c468b4776e9151efdf866d52b6d8f1d5.png

图2.7.3.1创建文件test

在图2.7.3.1中我们创建了一个文件:test,这个文件的默认权限为“rw-rw-r--”,我们将其权限改为“rwxrw-rw”,对应数字就是766,操作如下:

399e59dd298cb0d082c7926470c8c4bf.png

图2.7.3.2修改权限

在图2.7.3.2中,我们修改文件test的权限为766,修改完成以后的test文件权限为“rwxrw-rw-”,和我们设置的一样,说明权限修改成功。

上面我们是通过数字来修改权限的,我们接下来使用字母来修改权限,操作如图2.7.3.3所示:

eb1e721683e29b247c3b49e70e58e3ce.png

图2.7.3.3使用字母修改文件权限

上面两个例子都是修改文件的权限,接下来我们修改文件夹的权限,新建一个test文件夹,在文件夹test里面创建a.c、b.c和c.c三个文件,如图2.7.3.4所示:

0d83815b5054cba7e08c91d2455a4ce6.png

图2.7.3.4test文件夹

在图2.7.3.4中test文件夹下的文件a.c、b.c和c.c的权限均为“rw-rw-r--”,我们将test文件夹下的所有文件权限都改为“rwxrwxrwx”,也就是数字777,操作如图2.7.3.5所示:

0d8d76c6b5251074ff7948f37413f739.png

图2.7.3.5递归修改文件夹权限

2、文件归属者修改命令chown

命令chown用来修改某个文件或者目录的归属者用户或者用户组,命令格式如下:

chown [参数] [用户名.] [文件名/目录]

其中[用户名.]表示要将文件或者目录改为哪一个用户或者用户组,用户名和组名用“.”隔开,其中用户名和组名中的任何一个都可以省略,命令主要参数如下:

-c 效果同-v类似,但仅回报更改的部分。

-f 不显示错误信息。

-h 只对符号连接的文件做修改,不改动其它任何相关的文件。

-R 递归处理,将指定的目录下的所有文件和子目录一起处理。

-v 显示处理过程。

在用户根目录下创建一个test文件,查看其文件夹所属用户和用户组,如图2.7.3.6所示:

bf5a8eac7909dcc5635f71f4e272d7cd.png

图2.7.3.6test文件信息查询

从图2.7.3.6中可以看出,文件test的归属用户为zuozhongkai,所属的用户组为zuozhongkai,将文件test归属用户改为root用户,所属的用户组也改为root,操作如图2.7.3.7所示:

bdcef2cd3d7fe18f0f019a5177206cbb.png

图2.7.3.7修改文件归属用户和归属组

命令shown同样也可以递归处理来修改文件夹的归属用户和用户组,用法和命令chown一样,这里就不演示了。

2.8 Linux磁盘管理

2.8.1 Linux磁盘管理基本概念

Linux的磁盘管理体系和Windows有很大的区别,在Windows下经常会遇到“分区”这个概念,在Linux中一般不叫“分区”而叫“挂载点”。“挂载点”就是将一个硬盘的一部分做成文件夹的形式,这个文件夹的名字就是“挂载点”,不管在哪个发行版的Linux中,用户是绝对看到不到C盘、D盘这样的概念的,只能看到以文件夹形式存在的“挂载点”.

文件/etc/fstab详细的记录了Ubuntu中硬盘分区的情况,如图2.8.1.1所示:

eb8957cfb55867e8853e4d20e52bba08.png

图2.8.1.1文件fstab

在图2.8.1.1中有一行“/ was on /dev/sda1 during installation”,意思是根目录“/”是在/dev/sda1上的,其中“/”是挂载点,“/dev/sda1”就是我们装Ubuntu系统的硬盘。由于我们的系统是安装在虚拟机中的,因此图2.8.1.1没有出现实际的硬盘。可以通过如下命令查看当前系统中的磁盘:

ls /dev/sd*

上述命令就是打印出所有以/dev/sd开头的设备文件,如图2.8.1.2所示:

eb7d2208a67a99a3a729a90a16a93c13.png

图2.8.1.2查看硬盘设备文件

在图2.8.1.2中有四个磁盘设备文件,其中sd表示是SATA硬盘或者其它外部设备,最后面的数字表示该硬盘上的第n个分区,比如/dev/sda1就表示磁盘sda上的第一个分区。图2.8.1.2中都是以/dev/sda开头的,说明当前只有一个硬盘。如果再插上U盘、SD卡啥的就可能会出现/dev/sdb,/dev/sdc等等。如果你的U盘有两个分区那么可能就会出现/dev/sdb1、dev/sdb2这样的设备文件。比如我现在插入我的U盘,插入U盘会提示U盘是接到主机还是虚拟机,如图2.8.1.3所示:

5833c7433fd1ad288b6700c5477cd37a.png

图2.8.1.3 U盘连接选择

设置好图2.8.1.3以后,点击“确定”按钮U盘就会自动连接到虚拟机中,也就是连接到Ubuntu系统中,我们再次使用命令“ls/dev/sd*”来查看当前的“/dev/sd*”设备文件,如图2.8.1.4所示:

9ae497cfbb071ad4e32f25d5e6d76659.png

图2.8.1.4插入U盘后的设备文件

从图2.8.1.4可以看出,相比图2.8.1.2多了/dev/sdb和/dev/sdb1这两个文件,其中/dev/sdb就是U盘文件,/dev/sdb1表示U盘的第一个分区,因为我的U盘就一个分区。

2.8.2磁盘管理命令

本节我们学习以下跟磁盘操作有关的命令,这些命令如下:

1、磁盘分区命令fdisk

如果要对某个磁盘进行分区,可以使用命令fdisk,命令格如下:

fdisk [参数]

主要参数如下:

-b 指定每个分区的大小。

-l 列出指定设备的分区表。

-s 将指定的分区大小输出到标准的输出上,单位为块。

-u 搭配“-l”参数,会用分区数目取代柱面数目,来表示每个分区的起始地址。

比如我要对U盘进行分区,千万不要对自己装Ubuntu系统进行分区!!!可以使用如下命令:

sudofdisk /dev/sdb

结果如图2.8.2.1所示:

b9d0821c25512f55d106625744c45b97.png

图2.8.2.1U盘分区界面

在图2.8.2.1中提示我们输入“m”可以查看帮助,因为fdisk还有一些字命令,通过输入“m”可以查看都有哪些子命令,如图2.8.2.2所示:

ed1c828b3e70f5b6b783e29641e1400e.png

图2.8.2.2fdisk命令的子命令

图2.8.2.2中常用的命令如下:

p 显示现有的分区

n 建立新分区

t 更改分区类型

d 删除现有的分区

a 更改分区启动标志

w 对分区的更改写入到硬盘或者存储器中。

q 不保存退出。

由于我的U盘里面还有一些重要的文件,所以不能现在不能进行分区,所以现在就不演示fdisk的分区操作了,后面我们讲解裸机例程的时候需要将可执行的bin文件烧写到SD卡,中烧写到SD卡之前需要对SD卡进行分区,到时候在详细讲解如何使用fdisk命令对磁盘进行分区。

2、格式化命令mkfs

使用命令fdisk创建好一个分区以后,我们需要对其格式化,也就是在这个分区上创建一个文件系统,Linux下的格式化命令为mkfs,命令格式如下:

mkfs [参数] [-t 文件系统类型] [分区名称]

主要参数如下:

fs 指定建立文件系统时的参数

-V 显示版本信息和简要的使用方法。

-v 显示版本信息和详细的使用方法。

比如我们要格式化U盘的分区/dev/sdb1为FAT格式,那么就可以使用如下命令:

mkfs–t vfat /dev/sdb1

3、挂载分区命令mount

我们创建好分区并且格式化以后肯定是要使用硬盘或者U盘的,那么如何访问磁盘呢?比如我的U盘就一个分区,为/dev/sdb1,如果直接打开文件/dev/sdb1会发现根本就不是我们要的结果。我们需要将/dev/sdb1这个分区挂载到一个文件夹中,然后通过这个文件访问U盘,磁盘挂载命令为mount,命令格式如下:

mount [参数] -t [类型] [设备名称] [目的文件夹]

命令主要参数有:

-V 显示程序版本。

-h 显示辅助信息。

-v 显示执行过程详细信息。

-o ro 只读模式挂载。

-o rw 读写模式挂载。

-s-r 等于-o ro。

-w 等于-orw。

挂载点是一个文件夹,因此在挂载之前先要创建一个文件夹,一般我们把挂载点放到“/mnt”目录下,在“/mnt”下创建一个tmp文件夹,然后将U盘的/dev/sdb1分区挂载到/mnt/tmp文件夹里面,操作如图2.8.2.3所示:

01ce7231e3e361f931a38d30713c6fb3.png

图2.8.2.3挂载U盘

在图2.8.2.3中我们将U盘以fat格式挂载到目录/mnt/tmp中,然后我们就可以通过访问/mnt/tmp来访问U盘了。

4、卸载命令umount

当我们不在需要访问已经挂载的U盘,可以通过umount将其从卸载点卸除,命令格式如下:

umount [参数] -t [文件系统类型] [设备名称]

-a 卸载/etc/mtab中的所有文件系统。

-h 显示帮助。

-n 卸载时不要将信息存入到/etc/mtab文件中

-r 如果无法成功卸载,则尝试以只读的方式重新挂载。

-t 仅卸载选项中指定的文件系统。

-v 显示执行过程。

上面我们将U盘挂载到了文件夹/mnt/tmp里面,这里我们使用命令umount将其卸载掉,操作如图2.8.2.4所示:

f04ff2d95a41a1b860f4c1466f458bd2.png

图2.8.2.4卸载U盘

在图2.8.2.4中,我们使用命令umount卸载了U盘,卸载以后当我们再去访问文件夹/mnt/tmp的时候发现里面没有任何文件了,说明我们卸载成功了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值