linux基础-文件系统
一、文件系统
日志文件系统(Journaling File System): 日志文件系统是一种通过使用日志(journal)或事务日志来保持数据一臀性的文件系统。在进行文件系统更改(如创建、删除文件或目录)之前,这些更改会先被记录到一个专门的区域,即日志。在实际更改文件系统之前,先写入这些日志条目。如果在更改过程中发生了崩溃或其他错误(比如突然断电),系统可以在重启后查看日志,以确定在故障发生时文件系统的状态,并且可以利用日志中的信息来恢复文件系统到一臀性状态,减少数据损坏的可能性。
非日志文件系统(Non-Journaling File System): 非日志文件系统不使用日志来记录文件系统更改。这意味着如果在写入操作过程中发生系统崩溃或断电,文件系统可能无法确定数据是否完全写入磁盘,从而可能导致文件系统损坏或数据丢失。恢复过程可能需要通过运行文件系统检查(如fsck)来尝试修复任何不一臀性,这通常比日志文件系统的恢复过程更耗时,并且可能无法完全恢复数据。
1.1、windows 下的文件系统
- FAT(包含FAT12、FAT16、FAT32等变体,非日志文件系统)
- NTFS
- exFAT
1.2、linxu下的文件系统
- ext2(非日志文件系统)
- ext3(兼容ext2)
- ext4(兼容ext3、ext2)
- XFS
- JFS
- UFS
- 兼容windows的FAT文件系统
- 网络文件系统NFS
可通过以下命令,在linux中确定当前磁盘挂载的 文件系统
#查看当前挂载的磁盘及对应的文件系统#"df"是“磁盘文件系统”的缩写,该命令用于报告文件系统的磁盘空间使用情况。#"-T"选项会使df显示文件系统的类型。#"-h"选项将使df以人类可读的格式(例如,KB,MB,GB)输出磁盘空间使用情况,而不是以块为单位。df -T -h
在输出信息中,还可以见到一些tmpfs的文件系统,这是一种基于内存的文件系统:
-
内存存储
tmpfs 使用系统的RAM来存储文件数据,因此读写速度非常快。
-
动态大小
tmpfs 的大小可以动态调整,最大值通常由系统参数或挂载选项决定。在没有使用时不占用空间,因此数据区域也是不连续的。
-
临时性
数据在系统重启后会丢失,因为它不存储在硬盘上。
tmpfs 常用于存放临时文件,比如系统的 /tmp 目录或其他需要快速访问的临时数据
同时,可以看到linux文件系统是挂载在路径上的, Linux 下一切皆为文件。
二、linux系统目录结构
| 文件夹 | 内容 |
|---|---|
| /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 | 系统设备和文件层次结构,并向用户程序提供详细的内核数据信息 |
三、常用命令
3.1、创建新文件命令—touch
touch 不仅仅可以用用来创建文本文档,其它类型的文档也可以创建,命令格式如下:
touch [参数] [文件名]使用 touch 创建文件的时候,如果[文件名]的文件不存在,那就直接创建一个以[文件名]命名的文件,如果[文件名]文件存在的话就仅仅修改一下此文件的最后修改日期。
常用的命令参数如下:
- -a 只更改存取时间。
- 如果 testfile.txt 存在,touch -a 将更新该文件的访问时间,而不改变修改时间。
- 如果 testfile.txt 不存在,touch 默认会创建一个新文件并设置其时间戳,除非使用了 -c 选项来防止文件创建。
- -c (—no-create):
- 当使用 -c 选项时,如果指定的文件不存在,touch 不会创建该文件。
- 如果文件已经存在,touch -c 会更新文件的时间戳。
- -d<日期> 使用指定的日期,而并非现在日期。
- 允许指定一个日期和时间字符串,用于设置文件的访问和修改时间。
- 日期字符串可以是多种格式,通常是相对自然语言的描述。
- 如:
Terminal window #将testfile.txt 的时间戳设置为 2023 年 1 月 1 日 12:34touch -d "2023-01-01 12:34" testfile.txt
- -t<时间> 使用指定的时间,而并非现在时间
- 允许使用一种更压缩的格式来指定时间戳,格式为 [[CC]YY]MMDDhhmm[.ss]
- 如果不指定秒数,默认是 0 秒
- 如:
Terminal window #将testfile.txt 的时间戳设置为 2023 年 1 月 1 日 12:34:56touch -t 202301011234.56 testfile.txt
如果不带参数项,则:
- 如果文件存在,它会同时更新文件的访问时间(atime)和修改时间(mtime)为当前时间
- 如果文件不存在,它会创建一个新的空文件,并设置其访问时间和修改时间为当前时间
可以使用以下命令查看文件的详细信息:
#查看详细的时间信息,包括访问时间、修改时间和状态更改时间stat filename
#查看修改时间ls -l filename
#查看访问时间ls -lu filename
#查看状态更改时间ls -lc filename3.2、文件夹创建命令—mkdir
使用以下命令进行文件夹创建:
mkdir [参数] [文件夹名目录名]主要参数如下:
- -p 如所要创建的目录其上层目录目前还未创建,那么会一起创建上层目录
3.3、文件及目录删除命令—rm
使用一下命令对文件/目录进行删除:
rm [参数] [目的文件或文件夹目录名]主要参数如下:
- -d 直接把要删除的目录的硬连接数据删成 0,删除该目录
- -f 强制删除文件和文件夹(目录)
- -i 删除文件或者文件夹(目录)之前先询问用户
- -r 递归删除,指定文件夹(目录)下的所有文件和子文件夹全部删除掉
- -v 显示删除过程
如果要移除某个文件夹下的所有文件和文件夹,可以使用命令:
#递归移除dir_b中的所有内容(文件夹和文件)rm -r dir_b
#递归移除dir_b中的所有内容(文件夹和文件),不删除dir_b文件夹rm -r dir_b/*3.4、文件夹(目录)删除命令—rmdir
除了用rm命令配合-r或-rf进行删除外,还可使用rmdif删除文件夹:
rmdir [参数] [文件夹(目录)]命令主要参数如下:
- -p 删除指定的文件夹(目录)以后,若上层文件夹(目录)为空文件夹(目录)的话就将其一起删除
3.5、文件复制命令—cp
Linux 下的复制命令为“cp”,命令描述如下:
cp [参数] [源地址] [目的地址]主要参数描述如下:
- -a 此参数和同时指定“-dpR”参数相同
- -d 在复制有符号连接的文件时,保留原始的连接
- -f 强行复制文件,不管要复制的文件是否已经存在于目标目录
- -I 覆盖现有文件之前询问用户
- -p 保留源文件或者目录的属性
- -r 或-R 递归处理,将指定目录下的文件及子目录一并处理
如果不加任何参数,cp只会复制文件:
#将文件t_file1.txt复制到dir_d文件夹中cp t_file1.txt dir_d/指定将某些后缀的文件复制到指定路径下:
#将当前路径下的dir_t文件夹中的.c文件复制到dir_b文件夹中cp dir_t/*.c dir_b将某个文件夹下的所有内容,复制到另外一个文件夹:
#将dir_t文件夹中的所有内容复制到dir_b中#等同于加-dpR参数cp -a dir_t/* dir_b3.6、文件移动命令—mv
linux下的文件移动命令为“mv”,命令描述如下:
mv [参数] [源地址] [目的地址]主要参数描述如下:
- -b 如果要覆盖文件的话覆盖前先进行备份
- -f 若目标文件或目录与现在的文件重复,直接覆盖目的文件或目录
- -i 在覆盖之前询问用户
#将dir_b文件夹下的所有.c文件,移动到dir_t文件夹中,如果存在覆盖,则提示mv -i dir_b/*.c dir_t四、文件压缩
linux常用的文件压缩和解压缩命令有:
zip、unzip、tar
其中zip和unzip是专门用于.zip文件的压缩和解压。
但在linux系统中,常用的压缩格式是.bz2和.gz两种格式,这两种可以使用tar进行压缩和解压。
4.1、zip命令
zip格式压缩命令,命令格式:
zip [参数] [压缩文件名.zip] [被压缩的文件]主要参数函数如下:
- -b<工作目录> 指定暂时存放文件的目录。
- -d 从 zip 文件中删除一个文件。
- -F 尝试修复已经损毁的压缩文件。
- -g 将文件压缩入现有的压缩文件中,不需要新建压缩文件。
- -h 帮助。
- -j 只保存文件的名,不保存目录。
- -m 压缩完成以后删除源文件。
- -n<字尾符号> 不压缩特定扩展名的文件。
- -q 不显示压缩命令执行过程。
- -r 递归压缩,将指定目录下的所有文件和子目录一起压缩。
- -v 显示指令执行过程。
- -num 压缩率,为 1~9 的数值
例如:
#将dir_t中的所有文件内容压缩到dir_t.zip中,并显示进度zip -rv dir_t.zip dir_t4.1、unzip命令
zip压缩文件解压命令,命令格式:
unzip [参数] [压缩文件名.zip]主要参数如下:
- -l 显示压缩文件内所包含的文件。
- -t 检查压缩文件是否损坏,但不解压。
- -v 显示命令显示的执行过程。
- -Z 只显示压缩文件的注解。
- -C 压缩文件中的文件名称区分大小写。
- -j 不处理压缩文件中的原有目录路径。
- -L 将压缩文件中的全部文件名改为小写。
- -n 解压缩时不要覆盖原有文件。
- -P<密码> 解压密码。
- -q 静默执行,不显示任何信息。
- -x<文件列表> 指定不要处理.zip 中的哪些文件。
- -d<目录> 把压缩文件解到指定目录下
例如:
#将dir_t.zip文件解压到zip_dir_t/文件夹下unzip -d zip_dir_t/ dir_t.zip
#将dir_t.zip文件解压到当前文件夹(工作路径)下unzip dir_t.zip4.2、tar命令
.bz2 和.gz 压缩格式的压缩和解压命令,命令格式如下:
tar [参数] [压缩文件名] [被压缩文件名]- -c 创建新的压缩文件。
- -C<目的目录> 切换到指定的目录。
- -f<备份文件> 指定压缩文件。
- -j 用 tar 生成压缩文件,然后用 bzip2 进行压缩。
- -k 解开备份文件时,不覆盖已有的文件。
- -m 还原文件时,不变更文件的更改时间。
- -r 新增文件到已存在的备份文件的结尾部分。
- -t 列出备份文件内容。
- -v 显示指令执行过程。
- -w 遭遇问题时先询问用户。
- -x 从备份文件中释放文件,也就是解压缩文件。
- -z 用 tar 生成压缩文件,用 gzip 压缩。
- -Z 用 tar 生成压缩文件,用 compress 压缩。
- -f 指定压缩文件名
例如:
#dir_t压缩为bz2 格式的压缩文件tar -vcjf dir_t.tar.bz2 dir_t
#dir_t压缩为gz 格式的压缩文件tar -vczf dir_t.tar.gz dir_t
#解压名为dir_t.tar.bz2的bz2压缩文件tar -vxjf dir_t.tar.bz2
#解压名为dir_t.tar.gz的gz压缩文件tar -vxzf dir_t.tar.gz五、文件查询、搜索
文件的查询和搜索也是最常用的操作,在嵌入式 Linux 开发中常常需要在 Linux 源码文件中查询某个文件是否存在,或者搜索哪些文件都调用了某个函数等等。
两个最常用的文件查询和搜索命令: find 和 grep
5.1、查询命令 find
find 命令用于在目录结构中查找文件,其命令格式如下:
find [路径] [参数] [关键字]路径是要查找的目录路径,如果不写的话表示在当前目录下查找,关键字是文件名的一部分,主要参数如下:
-name
-depth 从指定目录下的最深层的子目录开始查找。
-gid<群组识别码>查找符合指定的群组识别码的文件或目录。
-group<群组名称> 查找符合指定的群组名称的文件或目录。
-size<文件大小> 查找符合指定文件大小的文件。
-type<文件类型> 查找符合指定文件类型的文件。
-user<拥有者名称> 查找符合指定的拥有者名称的文件或目录
例如:
#查找/home/lim路径下所有的.c文件find /home/lim -name *.c
#查找/home/lim路径下名称前面是ir的文件/文件夹find /home/lim -name "ir*"5.1、搜索命令 grep
find 命令用于在目录中搜索文件,我们有时候需要在文件中搜索一串关键字, grep 就是完成这个功能的, grep 命令用于查找包含指定关键字的文件,如果发现某个文件的内容包含所指定的关键字, grep 命令就会把包含指定关键字的这一行标记出来, grep 命令格式如下:
grep [参数] [关键字] [文件列表]grep 命令一次只能查一个关键字,主要参数如下:
-b 在显示符合关键字的那一列前,标记处该列第 1 个字符的位编号。
-c 计算符合关键字的列数。
-d<进行动作> 当指定要查找的是目录而非文件时,必须使用此参数!否则 grep 指令将回报信息并停止搜索。
-i 忽略字符大小写。
-v 反转查找,只显示不匹配的行。
-r 在指定目录中递归查找。
例如:
#在目录/usr 下递归查找包含字符“Ubuntu”的文件grep -ir "Ubuntu" /usr
#在当前目录下递归查找包含字符“测试文本1”的文件grep -ir "测试文本1"六、文件类型
使用ls命令可以列出当前路径下的所有文件,当我们加上-l参数时:
#列出当前路径下所有文件的详细信息ls -l
#列出当前路径下所有文件的详细信息(包括隐藏)ls -al执行结果如下:
可以看到,每一行的行首都会有一串字符和“-”构成的文本。第一个字符表示文件类型,接下来的九个字符分为三组,每组三个字符,分别表示文件所有者(owner)、所属组(group)和其他用户(others)的权限
- 文件类型(1字符):
字符 含义 - 表示普通文件 d 表示目录 l 表示链接文件(符号链接),类似于windows下的快捷方式 c 字符设备文件 b 块设备文件 s 套接字文件 p 表示管道文件(FIFO) - 所有者权限(2~4字符):
- 所属组的权限(5~7字符):
- 其他用户权限(8~10字符):
字符 含义 r 读权限 w 写权限 x 执行权限 - 没有相应权限(或留空)
如图片中的py,信息为:
drwxrwxr-x意味着这是一个目录
所有者(lim):具备读、写、执行权限
所有组(lim):即所有在这个用户组的成员,都具备读、写、执行权限
其他用户:具备读、执行权限
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!