文件管理

1、文件系统目录结构

image.png

1.1 文件系统的目录结构

  • 文件和目录被组织成一个单根倒置树结构
  • 文件系统从根目录下开始,用“/”表示
  • 根文件系统(rootfs):root filesystem
  • 标准Linux文件系统(如:ext4),文件名称大小写敏感,例如:MAIL, Mail, mail, mAiL
  • 以 . 开头的文件为隐藏文件
  • 路径分隔的 /
  • 文件名最长255个字节
  • 包括路径在内文件名称最长4095个字节
  • 蓝色—>目录 绿色—>可执行文件 红色—>压缩文件

    1. 浅蓝色-->链接文件 灰色-->其他文件
  • 除了斜杠和NUL,所有字符都有效.但使用特殊字符的目录名和文件不推荐使用,有些字符需要用引 号来引用

  • 每个文件都有两类相关数据:

     元数据:metadata,即属性, <br />       数据:data,即文件内容
    

    1.2 常见的文件系统目录功能

1.3Linux下的文件类型及目录

1.31文件类型

  • -:普通文件
  • d: 目录文件
  • b: 块设备
  • c: 字符设备
  • l: 符号链接文件
  • p: 管道文件pipe
  • s: 套接字文件socket

    2.文件操作命令

    2.1 显示当前工作目录

    2.2 绝对和相对路径

  • 绝对路径

     以正斜杠/ 即根目录开始 <br />       完整的文件的位置路径 <br />       可用于任何想指定一个文件名的时候 
    
  • 相对路径名

     不以斜线开始 <br />        指相对于当前工作目录的路径或某目录的位置 <br />        可以作为一个简短的形式指定一个文件名
    
  • 基名:basename 只取文件名而不要路径

  • 目录名:dirname 只取路径,不要文件名

    2.3更改目录

    cd命令

  • 改变目录

  • 使用绝对或相对路径:
    cd /home/fang
    cd home/fang
  • 切换至父目录: cd ..
  • 切换至当前用户主目录: cd
  • 切换至以前的工作目录: cd -
  • 选项:-P
  • 相关的环境变量:
    PWD:当前目录路径
    OLDPWD:上一次目录路径

    2.4列出目录内容

    ls 命令

  • 可以列出当前目录的内容或指定目录

常见选项

  • ls -a 包含隐藏文件

  ls -d /etc/.
  ls -d /etc/.[^.]
目录下所有隐藏文件
  ls -I “[^.]*” -a
  l .

  • ls -l 显示额外的信息
  • ls -R 目录递归

  ls -lR /etc/ | grep “^-“ | wc -l 统计目录所有的文件

  • ls -ld 目录和符号链接信息

  ls -ld /etc 查看目录信息

  • ls -1 文件分行显示
  • ls –S 按从大到小排序

  ls -Sr 按从小到大排序

  • ls –t 按mtime排序
  • ls –u 配合-t选项,显示并按atime从新到旧排序
  • ls –U 按目录存放顺序显示
  • ls –X 按文件后缀排序

    2.5 查看文件状态 stat

  • 文件相关信息:metadata(元数据) data(数据)

     一个是存放文件的元数据<br />       一个是真正存放文件数据的本身
    
  • 每个文件有三个时间戳

access time 访问时间,atime,读取文件内容
modify time 修改时间,mtime,改变文件内容(数据) change time 改变时间,
ctime,元数据发生改变(文件的内容没有修改、修改的是属性,类似于 修改权限)
mtime属于元数据ctime的属性。
但是修改ctime不一定会修改mtime时间。

2.6确认文件内容

文件可以包含多种类型的数据,使用file命令检查文件的类型
常用选项:

  • -b 列出文件辨识结果时,不显示文件名称
  • -f filelist 列出文件filelist中文件名的文件类型
  • -F 使用指定分隔符号替换输出文件名后默认的”:”分隔符
  • -L 查看对应软链接对应文件的文件类型

    2.7文件通配符

    ```
  • 匹配零个或多个字符 但不匹配”.”开头的文件,即隐藏文件 ? 匹配任何单个字符 ~ 当前用户家目录 ~han 当前han家目录 ~+和 . 当前工作目录 ~- 前一个工作目录 [0-9] 匹配数字范围,表示为0到9的任意一个 [a-z] 字母 [A-Z] 字母 [han] 匹配列表中的任何一个字符 [^han] 匹配列表中的所以字符以外的字符 [:digit:]:任意数字,相当于0-9 [:lower:]:任意小写字母,表示 a-z [:upper:]: 任意大写字母,表示 A-Z

[:alnum:]:任意数字或字母 [:blank:]:水平空白字符 [:space:]:水平或垂直空白字符 [:punct:]:标点符号 [:print:]:可打印字符 [:cntrl:]:控制(非打印)字符 [:graph:]:图形字符 [:xdigit:]:十六进制字符

<a name="XSAk8"></a>
### 2.8创建空文件和刷新时间
touch 命令可以用来创建空文件或刷新文件的时间<br />选项说明:

- -a 仅改变 atime和ctime 
- -m 仅改变 mtime和ctime 
- -t [[CC]YY]MMDDhhmm[.ss]   指定atime和mtime的时间戳 
- -c 如果文件不存在,则不予创建
<a name="mz8F3"></a>
### 2.9复制文件或目录
利用 cp(copy)命令可以实现文件或目录的复制<br />常用选项 

- -i 如果目标已存在,覆盖前提示是否覆盖
- -n 不覆盖,注意两者顺序 
- -r, -R 递归复制目录及内部的所有内容 
- -a 归档,相当于-dR --preserv=all,常用于备份功能 
- -d --no-dereference --preserv=links 不复制原文件,只复制链接名
- -p 等同--preserv=mode,ownership,timestamp
-  -v --verbose -u --update 只复制源比目标更新文件或目标不存在的文件 
- -b 目标存在,覆盖前先备份,默认形式为 filename~ ,只保留最近的一个备份 
- --backup=numbered 目标存在,覆盖前先备份加数字后缀,形式为 filename.~#~ ,可以保留多个版本![image.png](https://cdn.nlark.com/yuque/0/2020/png/8421132/1608625032007-46dc9853-3131-4b7c-b4c4-7883b8193fef.png#align=left&display=inline&height=323&margin=%5Bobject%20Object%5D&name=image.png&originHeight=396&originWidth=744&size=99732&status=done&style=none&width=606)
<a name="FbRDk"></a>
### 2.10移动和重命名文件
mv 命令可以实现文件或目录的移动和改名 <br />同一分区移动数据,速度很快:数据位置没有变化 <br />不同分区移动数据,速度相对慢:数据位置发生了变化<br />常用选项:

-  -i 交互式 
- -f 强制 -
- -b 目标存在,覆盖前先备份

**利用rename 可以批量修改文件名**

为所有的conf文件加上.bak后缀:

rename ‘conf’ ‘conf.bak’ f*

去掉所有的bak后缀:

rename ‘.bak’ ‘’ *.bak 复制代码

<a name="jy5I0"></a>
### 2.11 删除文件
使用 rm 命令可以删除文件,挂载点目录是不能够被删除的<br />常用选项: <br />-i 交互式 <br />-f 强制删除 -<br />r 递归 --no-preserve-root 删除/<br />删除特殊文件:

将名为 “/data/-f” 的文件删除

[root@centos8 data]#rm -f -f #此方式错误 [root@centos8 data]#rm — -f [root@centos8 data]#rm ./-f [root@centos8 data]#rm /data/-f

[root@centos8 data]#touch ‘~’ [root@centos8 data]#ls ‘~’ [root@centos8 data]#rm -f ~ rm: cannot remove ‘/root’: Is a directory [root@centos8 data]#rm — ~ rm: cannot remove ‘/root’: Is a directory [root@centos8 data]#rm -f ./~ 复制代码 ```

3、目录操作

3.1显示目录树tree

常见选项:

  • -d: 只显示目录
  • -L level:指定显示的层级数目
  • -P pattern: 只显示由指定wild-card pattern匹配到的路径

    3.2创建目录 mkdir

    常见选项:

  • -p: 存在于不报错,且可自动创建所需的各目录

  • -v: 显示详细信息
  • -m MODE: 创建目录时直接指定权限

    3.3 删除空目录rmdir

    常见选项:

  • -p 递归删除父空目录

  • -v 显示详细信息

注意:
rmdir只能删除空目录,如果想删除非空目录,可以使用rm -r 命令,递归删除目录树

4、文件元数据和节点表结构

4.1inode表结构

每个文件的属性信息,比如:文件的大小,时间,类型等,称为文件的元数据(meta data)。
这此元数 据是存放在node(index node)表中。
node 表中有很多条记录组成,第一条记录对应的存放了一个文 件的元数据信息
第一个node表记录对应的保存了以下信息:

  • inode number 节点号
  • 文件类型
  • 权限
  • UID
  • GID
  • 链接数(指向这个文件名路径名称个数)
  • 该文件的大小和不同的时间戳
  • 指向磁盘上文件的数据块指针
  • 有关文件的其他数据

目录与inode关系:

  • 文件引用的是 inode号
  • 人是通过文件名来引用一个文件
  • 一个目录是目录下的文件名和文件inode号之间的映射

    5、软、硬链接

    5.1硬链接

  • 创建硬链接会增加额外的记录项以引用文件

  • 对应于同一文件系统上一个物理文件
  • 每个目录引用相同的inode号
  • 创建时链接数递增
  • 删除文件时:
    ♦ rm命令递减计数的链接
    ♦ 文件要存在,至少有一个链接数
    ♦ 当链接数为零时,该文件被删除
  • 不能跨越驱动器或分区
  • 语法:
    ln filename [linkname ]
    ln file1 file2 本质上给file1 起了一个新的名字 同一个文件、不同的名字

    5.2软(或符号)链接

  • 一个符号链接指向另一个文件
    软链接本质上不是同一个文件,链接文件依赖原文件

  • ls - l的 显示链接的名称和引用的文件
  • 一个符号链接的内容是它引用文件的名称
  • 可以对目录进行
  • 可以跨分区
  • 指向的是另一个文件的路径;其大小为指向的路径字符串的长度;不增加或减目标文件inode的引用计数;

    5.3软、硬链接本质区别

  • 软链接本质上是一个新的文件、只是一个快捷方式,硬链接本质上是同一个文件,重新命名了一个新名称

  • 创建软链接不会增加链接数,创建硬链接、会增加文件链接数
  • 软链接支持跨分区、跨设备、目录,硬链接不支持跨分区、跨设备、目录
  • 创建软链接节点编号与原始文件节点编号不相同。创建硬链接,节点编号与原始文件节点编号相同
  • 软链接文件与原始文件有主次之分,软链接文件依赖原始文件。硬链接文件与原始文件关系平等