目录
一、文件存储
二、硬链接与软链接
硬链接
如何创建硬链接:
硬链接知识小结
软连接
如何创建软连接?
软连接知识小结:
三、文件删除的原理
四、文件目录管理命令
cp命令
mv 命令
rm 命令
find命令
cut命令
sort 命令
uniq 命令
wc 命令
head命令
tail命令
split命令
五、文件搜索工具
字符匹配
分组及引用
Linux文件搜索命令
which命令
whereis命令
type命令
find命令
文件存储?
文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。
操作系统读取硬盘的时候,一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 sector组成一个 block。
什么是inode?
储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。
显示文件和文件系统的详细信息
可以用stat命令,查看某个文件的inode信息:
文件的时间戳,共有三个:
ctime显示的是文件的权限、拥有者、所属的组、链接数发生改变时的时间。当然当内容改变时也会随之改变(即inode内容发生改变和Block内容发生改变时)
mtime指文件内容上一次变动的时间,
atime指文件最后被访问的时间。
* 链接数,即有多少文件名指向这个inode
df命令 查看文件系统磁盘空间占用情况
查看每个硬盘分区的inode信息,可以使用df -i命令。
inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。
一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。
每个inode节点的大小,一般是128字节或256字节。
inode节点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode。
表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:
首先,系统找到这个文件名对应的inode号码;
其次,通过inode号码,获取inode信息;
最后,根据inode信息,找到文件数据所在的block,读出数据。
使用ls -i命令,可以看到文件名对应的inode号码:
Unix/Linux系统中,目录(directory)也是一种文件。打开目录,实际上就是打开目录文件。
目录文件的结构非常简单,就是一系列目录项(dirent)的列表。
每个目录项,由两部分组成:所包含文件的文件名,以及该文件名对应的inode号码。
df -h命令 以可读性较高的方式来查看磁盘使用情况;
源文件与硬链接文件的inode是一样的;硬链接文件与原始文件其实是同一个文件,只不过是不同的名字而已。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。仅删除一个链接并没有影响。
如何创建硬链接:
ln 源文件名 硬链接名
如果给一个源文件创建了硬链接文件,将硬链接文件移动至其他文件后不小心将源文件删除,然后通过cp命令将硬件文件弄到之前源文件所在地址后,在使用ls -i命令查看inode号,会发现他的inide号改变了,通过mv命令将硬件文件弄到之前源文件所在地址后它的inode号没有变。
改名和移动不会影响inode号,cp命令才会影响。
硬链接知识小结
软连接的源文件和链接文件的内容一样,inode号不一样;将软连接文件删除,源文件还可以访问,将源文件删除,则不能访问链接文件。
如何创建软连接?
ln -s 源文件名 软连接文件名
软连接知识小结:
内存会被进程占用, 只有当进程被释放时,内存才会被释放
每个文件都有2各link计数器:i_count(内存引用计数器)和i_nlink(磁盘引用计数器);
想要彻底删除文件,必须使该文件的i_count和i_nlink都为0;
好比一个文件正在被进程调用,而用户却使用rm将文件删除了,这时虽然找不到这个文件了,但是调用该文件的进程仍然在执行,该文件的内存未被释放。 因为rm操作只是将i_nlink数减少了,如果没有其它链接文件那么它的i_nlink数为0,但由于该文件还在被进程引用,所以i_count不为0,系统并没有真正的删除这个文件,想要彻底删除文件,必须使该文件的i_count和i_nlink都为0。
copy 实现文件或目录的拷贝
copy file1 file2 实现文件 file1 的内容拷贝到文件 file2 上,如果文件 file2 已存在则覆盖,不存在则创建
常用参数:
- -i:交互式复制,有文件覆盖的时候提醒用户确认
- -f:强制覆盖 (相当于复制文件时若有同名的文件则强制覆盖)
- -d:复制符号链接文件本身,而非源文件
- -P:保留源文件或者目录的路径
- -R, -r, 递归拷贝
- -p 保留源文件的属性权限时间等
可以实现移动文件或重命名
mv 后可以是一个目录也可以是一个文件;如果源文件和目标文件在同一目录中,那就是改名。
- -f:强制覆盖,如果目标文件已经存在,则不询问,直接强制覆盖;
- -i:交互移动,如果目标文件已经存在,则询问用户是否覆盖(默认选项);
- -n:如果目标文件已经存在,则不会覆盖移动,而且不询问用户;
- -v:显示文件或目录的移动过程;
- -u:若目标文件已经存在,但两者相比,源文件更新,则会对目标文件进行升级;
实现删除文件或目录
常见参数有:
-f, 强制性删除并没有提示
-r, -R,递归删除包含目录下的子目录及文件
-d:删除空文件夹
find 命令是直接在硬盘中进行搜索的,如果指定的搜索范围过大,find命令就会消耗较大的系统资源,导致服务器压力过大。所以,在使用 find 命令搜索时,不要指定过大的搜索范围。
命令格式:
[root@localhost ~]# find 搜索路径 [选项] 搜索内容
例子: 查找/目录下所有以.log 结尾的文件
[root@rsys_server test]# find / -name "*.log"
就是在文件中负责剪切数据用的。cut 是以每一行为一个处理对象的;
常用参数:
- -d 自定义分割符,如果不定义则使用默认分隔符 tab 键;
- -f 显示指定字段的内容
- -c 参数指定切割字符数从起始数到截止数;(cut -c "1-2" wb 切割wb文件中的前两个字符)
- -b:以字节为单位进行分割
举例:
以空格为分割符切割,显示第一个字段内容;
以空格为分割符切割,显示第一个字段到第三个字段内容;
显示cut.txt文件中第1个和第3个字符
显示cut.txt文件中第1个到第3个字符
sort 命令用来排序,通常是结合文本处理工具使用;
常用参数:
-b 忽略每行前面的空格字符。 -f 忽略大小写 -M 将前面3个字母依照月份的缩写进行排序。 -n 依照数值的大小排序。 -o <输出文件> 将排序后的结果存入制定的文件。 -r 以相反的顺序来排序。 -t <分隔字符> 指定排序时所用的栏位分隔字符。 -k 指定需要排序的栏位
-u 相同数据仅出现一行 如下:
[root@localhost ~]# sort -k 2 -t "." sort.txt
AA:BB:CC
ee:60:5.1
dd:20:4.2
cc:50:3.3
ee:40:5.3
bb:10:2.4
aa:30:1.9(表示按"."分隔开。将第二列从小到大排序。)
主要用来实现去除重复行 前提条件是必须是先排序过的文本
常用参数:
- -c:在每行前加出现次数(uniq命令加-c选项可以实现对重复次数进行统计。)
- -d:只输出重复行
- -i:比较时不区分大小写
- -u:只显示唯一行
- -s:跳过
- -w:忽略
统计文件的字节或者行数等信息
常用参数:
- -c:统计字节数
- -l:统计行数
- -L:统计最长行的长度
- -m:统计字符数
- -w:统计单词数,以空格为分界点
显示前几行
显示后几行
-f 随着文件自增自动显示最后新增的内容(新增的内容并不会保存到源文件中)
分割文档命令
- -l num :指定分割的行数num行
- -b :按照每个文件的大小分割 KB MB
- -d :使用数字做后缀 搭配-a使用 指定数字长度
- -c :分割的文件单行的最大字节数 byte-
(这个博客巨详细!!)
. 匹配任意单个字符(grep 'r..t' /etc/passwd)
* 匹配其前面字符任意次;0,1,多次;例如grep "x*y"
? 匹配其前面字符0次或1次;(基本正则要加/,扩展正则不用加)
+ 匹配其前面字符1次或多次;
.* 匹配任意多个字符
(使用grep命令即为正则表达式,不适用grep为通配符。)
单词:非特殊字符组成的连续字符(字符串)都称为单词;
<root 用于单词模式的左侧,类似于以某个单词开头;
root> 用于单词模式的左侧,类似于以某个单词结尾
<apple> 用于匹配完整的单词;
which命令
在$PATH的所有目录里搜索某个系统命令的位置,默认在第一个文件中查找到了就不去其它文件里找到;内部命令也是找不到的(例如:history)
-a 在所有目录里找系统命令
--skip-alias 只有文件目录没有别名(针对有命令别名的)
whereis命令
查询命令或程序的帮助手册的位置
-b 只查找可执行命令
-m 只查找帮助文件
type命令
用来分辨该命令是外部命令还是内部命令(shell builtin)还是别名
find命令
功能描述:在目录中查找文件。不仅可以按照文件名搜索文件,还可以按照权限、大小、时间、inode 号等来搜索文件。但是 find 命令是直接在硬盘中进行搜索的,如果指定的搜索范围过大,find命令就会消耗较大的系统资源,导致服务器压力过大。所以,在使用 find 命令搜索时,不要指定过大的搜索范围。
命令格式:find 搜索路径 [选项] 搜索内容
常用参数:
- -name: 按照文件名搜索;
- -iname: 按照文件名搜索,不区分文件名大小;
- -inum: 按照 inode 号搜索;
- -size[+-]大小:按照指定大小搜索文件(这里的"+"的意思是搜索比指定大小还要大的文件,"-" 的意思是搜索比指定大小还要小的文件。)
- -atime [+-]时间: 在过去 n 天内被读取过的文件
- -mtime [+-]时间: 在过去 n 天内修改过的文件
- -ctime [+-]时间: 并不总是代表文件的创建时间。它通常表示文件状态的最后改变时间,这可能包括文件的元数据(如权限、所有权等)的变更。
这三个时间的区别我们在 stat 命令中已经解释过了,这里用 mtime 数据修改时间来举例,重点说说 "[+-]"时间的含义。
-5:代表5天内天修改的文件。
5: 代表前5~6天那一天修改的文件。
+5: 代表5天前修改的文件。
举例:
实例1:ls -l命令放在find命令的-exec选项中
命令: