文件管理

这里我们主要介绍LinuxFHS,文件类型,文件的创建、复制、移动与删除。

Linux下软、硬链接以及其区别,inode工作原理

文件和目录被组织成一个单根倒置树结构
文件系统从 根目录 下开始,用“/” 表示
根文件系统(rootfs) :root filesystem
名称是大小写敏感(FAT格式下大小写不敏感)
以. 开头的文件为隐藏文件
路径分隔的 /


文件有两类数据:
元数据:metadata 文件的属性 inode table
数据:data 文件里的内容
元数据和数据不存放在一起


文件系统分层结构:LSB Linux Standard Base

FHS: (Filesystem Hierarchy Standard)
/
├── bin 供所有用户使用的基本命令;不能关联至独立分区,OS启动即会用到的程序
├── boot 引导文件存放目录,内核文件都存放在此目录
├── dev 设备文件及特殊文件存储位置(b: block device,块设备,随机访问)
(c: character device,字符设备通常是逻辑上的设备,不是物理设备顺序访问 无缓存)
├── etc 配置文件目录
├── home 普通用户的家目录
├── lib 启动时程序依赖的基本共享库文件以及内核模块文件
├── lib64 专用于x86_64 系统上的辅助共享库文件存放位置
├── media 便携式移动设备挂载点
├── mnt 手动挂载
├── opt 第三方应用程序的安装位置
├── proc 用于输出内核与进程信息相关的虚拟文件系统
├── root root用户的家目录
├── sbin
├── selinux 相关的安全策略等信息的存储位置
├── srv 系统上运行的服务用到的数据
├── sys 用于输出当前系统上硬件设备相关信息虚拟文件系统
├── tmp 临时文件存储位置
├── usr usr文件系统包含所有的命令、库文件以及正常操作时所需的其他一些非改变文件
└── var 动态数据文件 cache(应用程序缓存),local (专用于为/usr/local 下的应用程序存储可变 数据),lock (锁文件),log(日志文件),opt: ( 专用于为/opt 下的应用程序存储可变数据), run(运行中的进程相关数据),spool(应用程序数据池),tmp(保存两次重启之间产生的临时数据 )

Linux 上的应用程序的组成部
二进制程序:/bin, /sbin, /usr/bin, /usr/sbin,/usr/local/bin, /usr/local/sbin
库文件:/lib, /lib64, /usr/lib, /usr/lib64,/usr/local/lib, /usr/local/lib64
配置文件:/etc, /etc/DIRECTORY, /usr/local/etc
帮助文件:/usr/share/man, /usr/share/doc, /usr/local/share/man, /usr/local/share/doc


包括路径在内文件名称最长4095 个字节,用/ 分隔的路径不能超过255
pwd:显示当前工作目录
pwd -P:真实路径
绝对路径与相对路径
绝对路径
以正斜杠开始
完整的文件的位置路径
可用于任何想指定一个文件名的时候
相对路径
不以斜线开始
指定相对当前的工作目录位置
可以作为一个简短的形式指定一个文件名


ls命令:
列出当前目录的内容或指定目录
用法:
ls [options] [files_or_dirs]
ls -a 包含隐藏文件
ls -l 显示额外的信息
ls -R 目录递归通过
ls -ld 目录和符号链接信息
ls -1 文件分行显示
ls –S 按从大到小排序
ls –u 配合-t 选项,显示并按atime 从新到旧排序
ls –U 不排序按目录存放顺序显示


Linux 下的文件类型

  • :普通文件
    d: 目录文件
    b: 块设备
    c: 字符设备
    l: 符号链接文件
    p: 管道文件pipe
    s: 套接字文件socket
    蓝色-->目录文件
    绿色--> 可执行文件
    红色--> 压缩文件
    浅蓝色--> 链接文件
    灰色--> 其他文件
    除了斜杠和NUL, 所有字符都有效. 但使用特殊字符的目录名和文件不推荐使用,有些字符需要用引号来引用它们。 标准Linux 文件系统(如ext4 ),文件名称大小写敏感。例如 :MAIL, Mail, mail, mAiL

文件通配符 

*匹配零个或多个字符
? 匹配任何单个字符
~ 当前用户家目录
~username 用户家目录
~+ 当前工作目录
~- 前一个工作目录
[0-9] 匹配一个数字范围
[a-z] :[a,A,b,B,c,C...z]
[A-Z] :[A,b,B,c,C...z,Z]
[wxc] 匹配列表中的任何的一个字符
[^wxc] 匹配列表中的所有字符以外的字符
[:digit:] :任意数字,相当于0-9
[:lower:] :任意小写字母
[:upper:]: 任意大写字母
[:alpha:]: 任意大小写字母
[:alnum:] :任意数字或字母
[:space:] :空格
[:punct:]:标点符号


touch -a 刷新atime ctime也随之改变
touch -c 不创建文件 存在文件刷新
touch -t 指定时间戳
touch -d


cp 复制文件和目录 

Linux系统文件管理以及连接文件和inode简介_第1张图片

cp [OPTION]... [-T] SOURCE DEST
cp [OPTION]... SOURCE... DIRECTORY
cp [OPTION]... -t DIRECTORY SOURCE...
单个文件
-f 删除原文件并且新建与源文件同名的文件在覆盖内容
-i 提示信息 提示是否覆盖
-n 文件存在不进行操作

[root@localhost ~]# cp zhl1 /testdir/
[root@localhost ~]# ls
anaconda-ks.cfg  Documents  Music     Public     Videos  zhl1
Desktop          Downloads  Pictures  Templates  z       zhl2
[root@localhost ~]# ls /testdir/zhl1
zhl1

多个文件
多个文件复制时目标必须是目录且必须存在
目标是目录必须 -r 递归
复制的原文件是目录,目标目录不存在,新建目标目录,并把原目录里面的文件复制到目标目录
复制的原文件是目录,目标目录存在直接复制原文件
-a 归档(备份)相当于-dR
-d只复制链接文件 不复制原文件
-p 等同--preserv=mode,ownership,timestamp
-v 显示复制过程

[root@localhost ~]# cp -rv /testdir /test‘/testdir’ -> ‘/test/testdir’
‘/testdir/zhl1’ -> ‘/test/testdir/zhl1’
[root@localhost ~]# ls /testtestdir

mv 移动和重命名文件 

mv [OPTION]... [-T] SOURCE DEST
mv [OPTION]... SOURCE... DIRECTORY
mv [OPTION]... -t DIRECTORY SOURCE...
: 常用选项:
-i: 交互式 -f: 强制

[root@localhost ~]# alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'alias mv='mv -i'
root账户cp命令为命令别名,需要直接使用cp命令需要:\cp
[root@localhost ~]# mv zhl2 /test/testdir/
[root@localhost ~]# ls /test/testdir/
zhl1  zhl2

rm 删除 \rm = rm -f

[zhl@localhost ~]$ ls
zz.log  zz.txt
[zhl@localhost ~]$ pwd
/home/zhl
[zhl@localhost ~]$ rm zz.txt

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

[root@localhost /]# tree /test1

/test1

└── test2

    └── test3

        └── test4


makdir


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

-v:  显示详细信息

-m MODE:  创建目录时直接指定权限;



Linux下软、硬链接以及其区别
Linux链接分两种,一种被称为硬链接,另一种被称为符号链接(Symbolic Link,也称软连接)。 硬连接 inode索引编号 ls -i 查看inode 同意分区不能相同不在同一个分区可以相同(centos7) 任何目录最少有两个硬链接

创建软连接 ln -s 原始文件路径 软连接

软连接文件 原始文件的路径如果用相对路经一定是相对于软连接文件的路经,而不是相对于当前工作目录的路经 硬连接指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为节点号(InodeIndex)。多个文件名指向同一索引节点,这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个路径名。因为对应该目录的索引节点有一个以上的连接,只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。而文件想要真正被删除的条件是把所有硬连接文件全部删除。
创建硬链接会增加额外的记录项以引用文件
对应于同一文件系统上一个物理文件
每个目录引用相同的 inode 号(inode索引编号)
ls -i 查看inode
同一个分区不能相同不在同一个分区可以相同(centos7)
硬链接不能跨分区,任何目录最少有两个硬链接
节点数2的是分区的根(centos6)
节点数128是分区的根 (centos7) 也就是分区的挂载点

[root@localhost ~]# touch zhl1
[root@localhost ~]# ln zhl1 zhl2
[root@localhost ~]# ls -li
total 8
201356611 -rw-------. 1 root root 2633 Jul 25 18:45 anaconda-ks.cfg    
    48425 drwxr-xr-x  2 root root    6 Jul 25 11:00 Desktop    
    48426 drwxr-xr-x  2 root root    6 Jul 25 11:00 Documents 
 67358293 drwxr-xr-x  2 root root    6 Jul 25 11:00 Downloads 
 67358299 drwxr-xr-x  2 root root    6 Jul 25 11:00 Music
134347196 drwxr-xr-x  2 root root    6 Jul 25 11:00 Pictures
201351352 drwxr-xr-x  2 root root    6 Jul 25 11:00 Public
134347195 drwxr-xr-x  2 root root    6 Jul 25 11:00 Templates
201351354 drwxr-xr-x  2 root root    6 Jul 25 11:00 Videos
201366792 -rw-r--r--  1 root root  131 Jul 27 01:58 z
201351350 -rw-r--r--  2 root root    0 Jul 27 02:48 zhl1
201351350 -rw-r--r--  2 root root    0 Jul 27 02:48 zhl2
新建文件zhl1,用ln 命令创建zhl1的硬连接文件zhl2
然后使用 ls -li查看,结果zhl1和zhl2的inode号是相同的

软连接
另外一种连接称之为符号连接(SymbolicLink),也叫软连接。软链接文件有类似于Windows的快捷方式。它实是一个特殊的文件,在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。

[root@localhost ~]# ln -s zhl1 zhl3
[root@localhost ~]# ls -li
total 8
201356611 -rw-------. 1 root root 2633 Jul 25 18:45 anaconda-ks.cfg    
    48425 drwxr-xr-x  2 root root    6 Jul 25 11:00 Desktop 
    48426 drwxr-xr-x  2 root root    6 Jul 25 11:00 Documents 
 67358293 drwxr-xr-x  2 root root    6 Jul 25 11:00 Downloads 
 67358299 drwxr-xr-x  2 root root    6 Jul 25 11:00 Music
134347196 drwxr-xr-x  2 root root    6 Jul 25 11:00 Pictures
201351352 drwxr-xr-x  2 root root    6 Jul 25 11:00 Public
134347195 drwxr-xr-x  2 root root    6 Jul 25 11:00 Templates
201351354 drwxr-xr-x  2 root root    6 Jul 25 11:00 Videos
201366792 -rw-r--r--  1 root root  131 Jul 27 01:58 z
201351350 -rw-r--r--  2 root root    0 Jul 27 02:48 zhl1
201351350 -rw-r--r--  2 root root    0 Jul 27 02:48 zhl2
201366794 lrwxrwxrwx  1 root root    4 Jul 27 02:50 zhl3 -> zhl1

使用ls -s命令新建zhl1的软连接文件zhl3
然后查看zhl1与zhl3的inode不同
这里我们先查看zhl1文件,发现zhl1文件是空白的
然后我们通过把/etc/issue文件的内容通过>>追加输出到文件zhl1然后查看各个文件的内容是否有变化。
[root@localhost ~]# cat zhl1
[root@localhost ~]# cat /etc/issue >> zhl1
[root@localhost ~]# cat zhl1

\SKernel \r on an \m

Mage Education Learning Services
[root@localhost ~]# cat zhl2

\SKernel \r on an \m

Mage Education Learning Services

[root@localhost ~]# cat zhl3

\SKernel \r on an \m

Mage Education Learning Services
这里我们发现zhl1,zhl2,zhl3文件内容一致。
[root@localhost ~]# rm -rf zhl2
[root@localhost ~]# cat zhl1

\SKernel \r on an \m

Mage Education Learning Services
[root@localhost ~]# cat zhl3

\SKernel \r on an \m

Mage Education Learning Services
尝试删除zhl2文件,结果发现对zhl1,zhl3无影响
[root@localhost ~]# rm -rf zhl3
[root@localhost ~]# cat zhl2

\SKernel \r on an \m

Mage Education Learning Services
[root@localhost ~]# cat zhl1

\SKernel \r on an \m

Mage Education Learning Services
删除zhl3文件,对与zhl1,zhl2文件无影响
我们尝试把软、硬连接的原文件zhl1删除
[root@localhost ~]# rm -rf zhl1
[root@localhost ~]# ls
anaconda-ks.cfg  Documents  Music     Public     Videos  zhl2
Desktop          Downloads  Pictures  Templates  z       zhl3
[root@localhost ~]# cat zhl2

\SKernel \r on an \m

Mage Education Learning Services
[root@localhost ~]# cat zhl3
cat: zhl3: No such file or directory
这里的结果显示当删除原文件zhl1后,硬连接zhl2不受影响,但是符号连接zhl3文件无效。

对照上面的小实验可以得到以下结论:
删除符号连接zhl3,对zhl1,zhl2无影响;
删除硬连接zhl2,对zhl1,zhl3也无影响;
删除原文件zhl1,对硬连接zhl2没有影响,导致符号连接zhl3失效.


inode 工作原理

操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性读取一个"块"(block),每个block由八个连续的sector组成。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,文件数据都储存在"块"中,那么还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode译为"索引节点"。每一个文件都有对应的inode,里面包含了与该文件有关的一些信息。每个存储设备(例如硬盘)或存储设备的分区被格式化为文件系统后,应该有两部份,一部份是inode,另一部份是Block,Block是用来存储数据用的。而inode呢,就是用来存储这些数据的信息,这些信息包括文件大小、属主、归属的用户组、读写权限等。inode为每个文件进行信息索引,所以就有了inode的数值。操作系统根据指令,能通过inode值最快的找到相对应的文件。 每个inode都有一个号码,Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称。表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号码;其次,通过inode号码,获取inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据。