linux基础-文件系统

4322 字
22 分钟
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中确定当前磁盘挂载的 文件系统

Terminal window
#查看当前挂载的磁盘及对应的文件系统
#"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 不仅仅可以用用来创建文本文档,其它类型的文档也可以创建,命令格式如下:

Terminal window
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:34
      touch -d "2023-01-01 12:34" testfile.txt
  • -t<时间> 使用指定的时间,而并非现在时间
    • 允许使用一种更压缩的格式来指定时间戳,格式为 [[CC]YY]MMDDhhmm[.ss]
    • 如果不指定秒数,默认是 0 秒
    • 如:
      Terminal window
      #将testfile.txt 的时间戳设置为 2023 年 1 月 1 日 12:34:56
      touch -t 202301011234.56 testfile.txt

如果不带参数项,则:

  • 如果文件存在,它会同时更新文件的访问时间(atime)和修改时间(mtime)为当前时间
  • 如果文件不存在,它会创建一个新的空文件,并设置其访问时间和修改时间为当前时间

可以使用以下命令查看文件的详细信息:

Terminal window
#查看详细的时间信息,包括访问时间、修改时间和状态更改时间
stat filename
#查看修改时间
ls -l filename
#查看访问时间
ls -lu filename
#查看状态更改时间
ls -lc filename

3.2、文件夹创建命令—mkdir#

使用以下命令进行文件夹创建:

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

主要参数如下:

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

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

使用一下命令对文件/目录进行删除:

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

主要参数如下:

  • -d 直接把要删除的目录的硬连接数据删成 0,删除该目录
  • -f 强制删除文件和文件夹(目录)
  • -i 删除文件或者文件夹(目录)之前先询问用户
  • -r 递归删除,指定文件夹(目录)下的所有文件和子文件夹全部删除掉
  • -v 显示删除过程

如果要移除某个文件夹下的所有文件和文件夹,可以使用命令:

Terminal window
#递归移除dir_b中的所有内容(文件夹和文件)
rm -r dir_b
#递归移除dir_b中的所有内容(文件夹和文件),不删除dir_b文件夹
rm -r dir_b/*

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

除了用rm命令配合-r或-rf进行删除外,还可使用rmdif删除文件夹:

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

命令主要参数如下:

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

3.5、文件复制命令—cp#

Linux 下的复制命令为“cp”,命令描述如下:

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

主要参数描述如下:

  • -a 此参数和同时指定“-dpR”参数相同
  • -d 在复制有符号连接的文件时,保留原始的连接
  • -f 强行复制文件,不管要复制的文件是否已经存在于目标目录
  • -I 覆盖现有文件之前询问用户
  • -p 保留源文件或者目录的属性
  • -r 或-R 递归处理,将指定目录下的文件及子目录一并处理

如果不加任何参数,cp只会复制文件:

Terminal window
#将文件t_file1.txt复制到dir_d文件夹中
cp t_file1.txt dir_d/

指定将某些后缀的文件复制到指定路径下:

Terminal window
#将当前路径下的dir_t文件夹中的.c文件复制到dir_b文件夹中
cp dir_t/*.c dir_b

将某个文件夹下的所有内容,复制到另外一个文件夹:

Terminal window
#将dir_t文件夹中的所有内容复制到dir_b中
#等同于加-dpR参数
cp -a dir_t/* dir_b

3.6、文件移动命令—mv#

linux下的文件移动命令为“mv”,命令描述如下:

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

主要参数描述如下:

  • -b 如果要覆盖文件的话覆盖前先进行备份
  • -f 若目标文件或目录与现在的文件重复,直接覆盖目的文件或目录
  • -i 在覆盖之前询问用户
Terminal window
#将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格式压缩命令,命令格式:

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

主要参数函数如下:

  • -b<工作目录> 指定暂时存放文件的目录。
  • -d 从 zip 文件中删除一个文件。
  • -F 尝试修复已经损毁的压缩文件。
  • -g 将文件压缩入现有的压缩文件中,不需要新建压缩文件。
  • -h 帮助。
  • -j 只保存文件的名,不保存目录。
  • -m 压缩完成以后删除源文件。
  • -n<字尾符号> 不压缩特定扩展名的文件。
  • -q 不显示压缩命令执行过程。
  • -r 递归压缩,将指定目录下的所有文件和子目录一起压缩。
  • -v 显示指令执行过程。
  • -num 压缩率,为 1~9 的数值

例如:

Terminal window
#将dir_t中的所有文件内容压缩到dir_t.zip中,并显示进度
zip -rv dir_t.zip dir_t

4.1、unzip命令#

zip压缩文件解压命令,命令格式:

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

主要参数如下:

  • -l 显示压缩文件内所包含的文件。
  • -t 检查压缩文件是否损坏,但不解压。
  • -v 显示命令显示的执行过程。
  • -Z 只显示压缩文件的注解。
  • -C 压缩文件中的文件名称区分大小写。
  • -j 不处理压缩文件中的原有目录路径。
  • -L 将压缩文件中的全部文件名改为小写。
  • -n 解压缩时不要覆盖原有文件。
  • -P<密码> 解压密码。
  • -q 静默执行,不显示任何信息。
  • -x<文件列表> 指定不要处理.zip 中的哪些文件。
  • -d<目录> 把压缩文件解到指定目录下

例如:

Terminal window
#将dir_t.zip文件解压到zip_dir_t/文件夹下
unzip -d zip_dir_t/ dir_t.zip
#将dir_t.zip文件解压到当前文件夹(工作路径)下
unzip dir_t.zip

4.2、tar命令#

.bz2 和.gz 压缩格式的压缩和解压命令,命令格式如下:

Terminal window
tar [参数] [压缩文件名] [被压缩文件名]
  • -c 创建新的压缩文件。
  • -C<目的目录> 切换到指定的目录。
  • -f<备份文件> 指定压缩文件。
  • -j 用 tar 生成压缩文件,然后用 bzip2 进行压缩。
  • -k 解开备份文件时,不覆盖已有的文件。
  • -m 还原文件时,不变更文件的更改时间。
  • -r 新增文件到已存在的备份文件的结尾部分。
  • -t 列出备份文件内容。
  • -v 显示指令执行过程。
  • -w 遭遇问题时先询问用户。
  • -x 从备份文件中释放文件,也就是解压缩文件。
  • -z 用 tar 生成压缩文件,用 gzip 压缩。
  • -Z 用 tar 生成压缩文件,用 compress 压缩。
  • -f 指定压缩文件名

例如:

Terminal window
#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 命令用于在目录结构中查找文件,其命令格式如下:

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

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

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

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

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

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

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

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

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

例如:

Terminal window
#查找/home/lim路径下所有的.c文件
find /home/lim -name *.c
#查找/home/lim路径下名称前面是ir的文件/文件夹
find /home/lim -name "ir*"

5.1、搜索命令 grep#

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

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

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

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

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

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

-i 忽略字符大小写。

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

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

例如:

Terminal window
#在目录/usr 下递归查找包含字符“Ubuntu”的文件
grep -ir "Ubuntu" /usr
#在当前目录下递归查找包含字符“测试文本1”的文件
grep -ir "测试文本1"

六、文件类型#

使用ls命令可以列出当前路径下的所有文件,当我们加上-l参数时:

Terminal window
#列出当前路径下所有文件的详细信息
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,信息为:

Terminal window
drwxrwxr-x

意味着这是一个目录

所有者(lim):具备读、写、执行权限

所有组(lim):即所有在这个用户组的成员,都具备读、写、执行权限

其他用户:具备读、执行权限

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
Profile Image of the Author
lim
Hello, I'm lim.
公告
欢迎来到我的博客!这是一则示例公告。
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
14
分类
3
标签
18
总字数
18,472
运行时长
0
最后活动
0 天前

文章目录