文件管理
这里我们主要介绍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: 管道文件pipes: 套接字文件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 -dcp 复制文件和目录
cp [OPTION]... [-T] SOURCE DEST
cp [OPTION]... SOURCE... DIRECTORYcp [OPTION]... -t DIRECTORY SOURCE...单个文件-f 删除原文件并且新建与源文件同名的文件在覆盖内容-i 提示信息 提示是否覆盖-n 文件存在不进行操作[root@localhost ~]# cp zhl1 /testdir/[root@localhost ~]# lsanaconda-ks.cfg Documents Music Public Videos zhl1Desktop Downloads Pictures Templates z zhl2[root@localhost ~]# ls /testdir/zhl1zhl1
多个文件
多个文件复制时目标必须是目录且必须存在目标是目录必须 -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... DIRECTORYmv [OPTION]... -t DIRECTORY SOURCE...: 常用选项:-i: 交互式 -f: 强制[root@localhost ~]# aliasalias 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 ~]$ lszz.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 -litotal 8201356611 -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 Music134347196 drwxr-xr-x 2 root root 6 Jul 25 11:00 Pictures201351352 drwxr-xr-x 2 root root 6 Jul 25 11:00 Public134347195 drwxr-xr-x 2 root root 6 Jul 25 11:00 Templates201351354 drwxr-xr-x 2 root root 6 Jul 25 11:00 Videos201366792 -rw-r--r-- 1 root root 131 Jul 27 01:58 z201351350 -rw-r--r-- 2 root root 0 Jul 27 02:48 zhl1201351350 -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 -litotal 8201356611 -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 Music134347196 drwxr-xr-x 2 root root 6 Jul 25 11:00 Pictures201351352 drwxr-xr-x 2 root root 6 Jul 25 11:00 Public134347195 drwxr-xr-x 2 root root 6 Jul 25 11:00 Templates201351354 drwxr-xr-x 2 root root 6 Jul 25 11:00 Videos201366792 -rw-r--r-- 1 root root 131 Jul 27 01:58 z201351350 -rw-r--r-- 2 root root 0 Jul 27 02:48 zhl1201351350 -rw-r--r-- 2 root root 0 Jul 27 02:48 zhl2201366794 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 \mMage Education Learning Services[root@localhost ~]# cat zhl2\SKernel \r on an \mMage Education Learning Services[root@localhost ~]# cat zhl3\SKernel \r on an \mMage Education Learning Services这里我们发现zhl1,zhl2,zhl3文件内容一致。
[root@localhost ~]# rm -rf zhl2[root@localhost ~]# cat zhl1\SKernel \r on an \mMage Education Learning Services
[root@localhost ~]# cat zhl3\SKernel \r on an \mMage Education Learning Services尝试删除zhl2文件,结果发现对zhl1,zhl3无影响
[root@localhost ~]# rm -rf zhl3[root@localhost ~]# cat zhl2\SKernel \r on an \mMage Education Learning Services
[root@localhost ~]# cat zhl1\SKernel \r on an \mMage Education Learning Services删除zhl3文件,对与zhl1,zhl2文件无影响
我们尝试把软、硬连接的原文件zhl1删除[root@localhost ~]# rm -rf zhl1[root@localhost ~]# lsanaconda-ks.cfg Documents Music Public Videos zhl2Desktop Downloads Pictures Templates z zhl3[root@localhost ~]# cat zhl2\SKernel \r on an \mMage Education Learning Services[root@localhost ~]# cat zhl3cat: 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,读出数据。