计算机对数据的基本操作大多数可以归纳为增删改查,文件操作也不例外。
touch 命令
项目 |
内容 |
命令名称 |
touch |
英文原意 |
change file timestamps |
所在路径 |
/bin/touch |
执行权限 |
所有用户 |
作用 |
修改文件的时间戳 |
命令格式
touch [选项] 文件名或目录名
选项:
-a: 只修改文件的访问时间(Access Time)
-c: 如果文件不存在,则不建立新文件
-d: 把文件的时间改为指定时间
-m: 只修改文件的数据修改时间(Modify Time)
Linux中的每个文件都有三个时间,分别是访问时间(Access Time)、数据修改时间(Modify Time)和状态修改时间(Change Time)。这三个时间可以通过 stat 命令查看。touch命令只能手工指定是只修改访问时间或者数据修改时间,不能指定只修改状态时间。因为前两者的改变都会影响后者。
注意,并没有文件创建时间!
- 三种时间的含义
读取文件内容 ------> 改变Acess Time
写文件内容 -------> 改变Modify Time and Change Time
只修改文件状态 -------> 改变Change Time
常用用法
- 创建空文件
- 文件存在也不会报错,只是三个时间都会变为touch命令执行的时间
stat命令
项目 |
内容 |
命令名称 |
stat |
英文原意 |
display file or file system status |
所在路径 |
/usr/bin/stat |
执行权限 |
所有用户 |
作用 |
显示文件或文件系统的详细信息 |
命令格式
stat [选项] 文件名或目录名
选项:
-f: 查看文件所在的文件系统的信息,而不是查看文件的信息
常用用法
- 查看文件的详细信息
- 查看文件系统时间
cat命令
项目 |
内容 |
命令名称 |
cat |
英文原意 |
concatenate files and print on the standard output |
所在路径 |
/bin/cat |
执行权限 |
所有用户 |
作用 |
合并文件并打印输出到标准输出 |
命令格式
cat [选项] 文件名
选项:
-A: 相当于-vET选项的集合,用于列出所有的隐藏符号
-E: 列出每行结尾的回车符$
-n: 显示行号
-T: 把Tab键用^T显示出来
-v: 列出特殊字符
常用用法
cat命令会将文件的所有内容一次性显示出来。
cat不适合查看太大的文件。
more命令
项目 |
内容 |
命令名称 |
more |
英文原意 |
file perusal filter for crt viewin |
所在路径 |
/bin/more |
执行权限 |
所有用户 |
作用 |
分屏显示文件内容 |
命令格式
more 文件名
文件过大,cat命令会有心无力,这是more命令的作用更加明显。
more命令比较简单,一般不用什么选项,命令会打开一个交互界面,可以识别一些命令。常用的交互命令如下:
-
space:向下翻页
-
b:向上翻页
-
Enter:向下滚动一行
-
/字符串:搜索指定的字符串
-
q:退出
常用用法
- 分屏显示
less命令
项目 |
内容 |
命令名称 |
less |
英文原意 |
opposite of more |
所在路径 |
/usr/bin/less |
执行权限 |
所有用户 |
作用 |
分行显示文件内容 |
命令格式
less 文件名
可以使用more的交互命令,也可以使用上下箭头。
常用用法
head命令
项目 |
内容 |
命令名称 |
head |
英文原意 |
output the first part of files |
所在路径 |
/usr/bin/head |
执行权限 |
所有用户 |
作用 |
显示文件开头内容 |
命令格式
head [选项] 文件名
选项:
-n 行数: 从文件头开始,显示指定行数
-v: 显示文件名
常用用法
- head默认显示文件开头的10行内容
- 使用-n
tail命令
项目 |
内容 |
命令名称 |
tail |
英文原意 |
output the last part of files |
所在路径 |
/usr/bin/tail |
执行权限 |
所有用户 |
作用 |
显示文件结尾内容 |
命令格式
tail [选项] 文件名
选项:
-n 行数: 从文件结尾开始,显示指定行数
-f: 监听文件的新增内容
常用用法
- 不加选项与-n选项与head类似
- 监听文件新增内容
ln命令
项目 |
内容 |
命令名称 |
ln |
英文原意 |
make links between file |
所在路径 |
/bin/ln |
执行权限 |
所有用户 |
作用 |
在文件之间建立链接 |
命令格式
ln [选项] 源文件 目标文件
选项:
-s: 建立软链接文件。如果不加-s则建立硬链接文件
-f: 强制。如果目标文件已经存在,则删除目标文件后再建立链接文件
若想理解此命令的用法,需先了解Linux文件系统是如何工作的。我们以现在主流的ext4为例,加以说明。
- ext4文件系统
ext4会把分区主要分为两个部分(暂时不提超级快):一小部分用于保存inode信息;剩余的大部分用于保存block信息。
inode默认大小128Byte,用来记录文件的权限、文件的所有者和属组、文件大小、文件时间戳、文件的数据真正保存的block编号。
block的大小可以使1KB、2KB、4KB,默认4KB。block用于实际的数据存储,如果一个block放不下数据,可以占用多个block。这些block可能连续,也可能分散。
- 注意,软链接文件的源文件必须写成绝对路径,而不能写成相对路径(硬链接没有这样的要求);否则软链接会报错。
常用用法
- 硬链接
先建立一个硬链接:
观察源文件和链接文件:
我们发现,两者几乎所有信息都相同,甚至inode号都相同,其原理如下:
在inode信息中,是不会记录文件名称的,而是把文件名称记录在上级目录的block中。也就是说,目录block中记录的是这个目录下所有的一级子文件和子目录的文件名和inode的对应;而文件的block中记录的才是文件的实际数据。当我们查找一个文件,比如/home/shz1/hello.c,需要经历如下步骤:
a. 首先找到根目录的inode(根目录的inode是已知的,是2),然后判断用户是否有权限访问根目录的block。
b. 如果有权限,则可以在根目录的block中找到/home的文件名以及对应的inode。
c. 通过/home的inode号,找到/home的inode信息,接着判断用户是否有权限访问/home的block。
…
最终找到访问到/home/shz1/hello.c的block,这样就完成了该文件的读取与访问。
显然,对于硬链接目标文件和源文件,实际上指的是同一个inode和block。
硬链接的限制比较多,不能跨文件系统,也不能链接目录,而且源文件和硬链接文件除了inode号是一样,没有其他明显特征。这些特征使得硬链接并不常用。
- 软链接
软链接也叫符号链接,相比硬链接,软链接常用很多,其实就相当于windows的快捷方式。再次注意,软链接源文件必须用绝对路径!否则报错。
软链接标志明显,首先,权限为中 “l” 表示这是一个软连接文件;其次,在文件中通过 “->” 显示出源文件的完整名字。
软链接并没有太多限制,可以跨文件系统,也可以链接目录。
软链接block保存的并非文件内容,而是链接文件的inode号,通过该inode,读取inode信息,读取源文件block,读取文件内容。