Linux中的文件操作
前言
相比于Windows等操作系统,Linux最常用的系统界面并不是图形界面,而是命令行界面,因此在Linux中大多数的操作都是依赖命令行来完成的;而无论是在日常的操作中或者是Shell编程中,文件的操作都是非常常见的,因此今天就来介绍一下文件的一些相关操作。
1.1 查看文件
最简单的查看当前文件的命令:
ls
执行此命令,系统将列出当前目录中文件的名称,一般情况下可以通过此命令来确定目录下存放的文件 但是此命令只能查看所存在的文件,而无法读取到更多的信息,因此会在此命令下加扩展来看到更加详细的内容,常用的扩展如下;
ls -l //查看详细信息
ls -a //查看隐藏文件
ls -la //查看所有文件的详细信息
示例图如下:
当使用-l来显示详细信息的时候,第一列表示文件的文件类型和访问权限,第一位是文件类型,第二位开始使用u,g,o,a来分别表示user,group,others,all,三个一组,此时的权限使用r,w,x三个字母连起来进行表达;第二列表示的是文件的硬链接数目,1即表示只有文件本身;第三列表示的是文件的所有者;第四列表示的是所有者的主用户组,第五列表示的是文件的大小;第六列为文件的最后访问时间;第七列是文件名。
当使用-a来显示隐藏文件的时候,第一行的文件名为一个圆点,表示当前的目录,第二行的文件名为两个圆点,表示当前目录的父目录,在所有的目录中都包含了这两个特殊的目录,第三行开始都是以圆点开头的普通隐藏文件。
此外,可以在ls相关的目录后加上路径来查看对应路径下的文件。
1.2 文件类型
Linux的文件类型比较多,文件类型主要可以分成以下三类:普通文件,目录和伪文件;下面根据分类来进行介绍:
1.2.1 普通文件
普通文件是日常最常见的文件形式了,普通文件包含了数据,通常存储在存储设备上的,我们常见的Word/Shell脚本等都属于普通文件。
普通文件可以分为文本文件和二进制文件两种类型,简单的来说,主要是我们能够理解内容的文本一般是文本文件,通常用于存储文本数据;而二进制文件包含了可显示字符和不可显示字符,二进制文件只有在执行或者是有其他程序解释的时候才有意义,一般人无法直接读取和理解二进制文件的内容,如果使用cat命令查看二进制文件,查看到的会是不可读的乱码。
1.2.2 目录
在Linux中,目录也是一种文件,和文件一样,目录也是存储在存储设备上,目录的作用是组织和访问其他的文件,和文件夹的作用类似。
当一个目录包含其他目录的时候,此目录将会被称为父目录,被包含的目录称为子目录;文件只有存放在目录文件中才可以找到,每个子目录和文件在其父目录中拥有一条记录。
1.2.3 伪文件
伪文件并不是用于存储数据,因此伪文件也并不占用磁盘空间;伪文件存在的目的是提供一种服务,通过伪文件系统可以像是操作普通文件一样来访问这些伪文件所代表的对象;
有一部分的伪文件是设备文件,设备文件是设备在系统里的内部表示,如鼠标,键盘;不同的设备会有不同的伪文件来表示;除了设备文件,还会有命名管道,通过使用命名管道,用户可以将一个命令的输出连接到另外一个命令的输入上;
还有一种伪文件是proc文件,主要负责访问内核中的信息。
1.3 文件权限
正如上述一样,文件的类型与权限是由十个字母来表示的,主要可分为四个部分:第一位表示文件的类型,是文件(-)还是目录;接下来三个部分每个部分由三个字母组成,分别表示:拥有者的权限,同群组用户的权力与其他用户的权限,三个字母依次表示:读、写、执行,拥有者和群组用户的权力都是读和写,其他用户只有读的权限;
可以说文件的权限对小说到文件,大到系统都是非常重要的,那我们如何修改文件的权限呢:
1.3.1 改变文件的拥有者
改变拥有者的英语为“change owner”,因此改变文件的拥有者的Linux指令为:chown,改变的时候注意需要在/etc/passwd文件中有对应的用户名才可以更改成功,相关的指令如下:
chown 账号名 文件名 //将文件的拥有者改为输入的账号
chown 账号名:组名 文件名 //将文件的拥有者和群组改为输入的账号
chown -R 账号名 文件名 //进行递归的持续变更,将该目录所有文件的拥有者改为输入的账号
chown 账号名:组名 文件名 //进行递归的持续变更,将该目录所有文件的拥有者和群组改为输入的账号
1.3.2 改变文件的权限组群
改变文件的权限组群的英语为“change group”,因此改变文件权限组群的Linux命令为:chgrp,改变的时候注意需要在/etc/group文件中有对应的用户组群才可以更改成功,相关的指令如下:
chgrp 组群名 文件名 //将文件的组群进行更改
chgrp -R 组群名 文件名 //将该目录下的文件的组群都进行更改
1.3.3 改变文件的权限
改变文件的读/写/执行权限见的比较多了,文件的权限设置可以分为两种方法,一种是使用数字设置,一种是使用字母来进行设置文件权限;
1.3.3.1 数字设置文件权限
刚才我们说到了读/写/执行的权限,在数字中它们分别表示为:r:4;w:2;x:1,一个数字代表一种身份的权限,数字的值为r,w,x三个字母的值相加,比如可读可写可执行的权限为4+2+1=7,如果三种身份的权限都一样,那么对应的数字为777;
我们使用chmod命令来对文件进行赋权:
chmod xyz 文件名 //对文件赋权,xyz为计算出来的值
chmod -R xyz 文件名 //对该目录下所有的文件都进行赋权,xyz为计算出来的值
1.3.3.2 字母设置文件权限
当我们使用字母来表示文件权限的时候,我们使用u,g,o,a来分别表示user,group,others,all,此时的权限使用r,w,x三个字母连起来进行表达,
例:
chmod u=rwx,go=r 文件名 //对文件赋权,user具有全部权限,其他的只有读权限
chmod a-w xyz 文件名 //对该文件的所有用户都进行减去执行的权限
和Windows系统不同的是,Linux执行看的是文件的权限,与文件的后缀无关,就算是可执行文件也需要先赋权才能够进行操作;且文件的写操作针对的是文件的内容进行添加/删减,并不意味着有了写的权限就可以删除文件。
刚刚我们介绍了读/写/执行的权限对于文件的作用,同样的,权相同的限对于一个目录而言又有不同的含义了:
读(r):是否具有读取目录结构列表的权限,有点话可以使用ls命令查看目录下所有的文件;
写(w):可以在目录下更名/移动/创建文件,甚至可以不顾文件的权限如何将文件删除;
执行(x):是否有执行权限代表着是否能在该目录下进行工作;即能否成功切换(cd)到该目录下;
1.4 查找文件
查找文件通常使用的是“find”命令,find命令非常强大,它的基本思想就是搜索一个或者是多个目录树,根据用户提供的条件找到符合条件的文件,find命令的基本语法如下:
find path test action
其中path为搜索的路径,可以是一个或者是多个,搜索多个的时候使用空格隔开,
find path //打印该路径下所有的文件
使用find path test命令可以对指定路径下的文件进行筛选,常用的筛选方式如下:
指令 | 作用 |
---|---|
-type | 指定文件类型,f为普通文件,d为目录,c为字符设备,b为块设备,l为链接 |
-name pattern | 指定匹配模式的文件名 |
-iname pattern | 指定匹配模式的文件名,不区分大小写 |
-perm mode | 查找权限被设置为指定mode的文件 |
-size size | 匹配文件大小为size的文件 |
-user userid | 匹配其所有者为指定用户ID的文件 |
-empty | 匹配空文件 |
-group groupid | 匹配其所有者的主组为指定组ID的文件 |
-amin[±]n | 文件最后一次访问时间,单位为分钟 ,-为xx分钟内,+为xx分钟前 |
-atime [±]n | 文件最后一次访问时间,单位为天 ,-为xx天内,+为xx天前 |
-cmin[±]n | 文件最后一次状态改变时间,单位为分钟 ,-为xx分钟内,+为xx分钟前 |
-ctime [±]n | 文件最后一次状态改变时间,单位为天 ,-为xx天内,+为xx天前 |
-mmin[±]n | 文件最后一次被修改时间,单位为分钟 ,-为xx分钟内,+为xx分钟前 |
-mtime [±]n | 文件最后一次被修改时间,单位为天 ,-为xx天内,+为xx天前 |
可以使用!来对测试条件进行取反,表示相反的测试条件;
加上action,及对查找到符合条件的内容进行处理,常用的命令有:
指令 | 作用 |
---|---|
默认操作,将符合的结果打印出来 | |
-fprint file | 将符合的结果打印至文件中 |
-ls | 详细显示搜索结果 |
-fls file | 详细显示搜索结果并打印至文件中 |
-ok command{}; | 查找并执行命令,需要用户确认 |
-exec command{}; | 查找并执行命令,{}表示搜索到的文件 |
-delete | 将搜索的文件进行删除 |
1.5 文件比较
在Linux中,大多数的数据都是以文件的形式进行存储管理的,在日常的管理中,经常需要进行文件比对;在Linux中,常用comm/diff命令进行文件比较,comm命令即英语中的common,意为共同的;diff命令即英语中的different,意为不同的,用这两个命令即可比较文件的相同/不同之处。
1.5.1 comm命令
comm命令的作用是据行比较两个有序文件,命令的使用如下:
comm 【option】... file1 file2 //file1和file2为要对比的文件
其中option为comm命令相关的操作,主要有:
-1:不显示第一个文件独有的文本行;
-2:不显示第二个文件独有的文本行;
-3:不显示两个文件中共同的文本行;
–check-orfer:检查参与比较的两个文件是否已经排序;
–nocheck-orfer:不检查参与比较的两个文件是否已经排序;
1.5.2 diff命令
diff命令和comm命令不同的是,diff不要求参与比较的文件是有序的,diff命令的使用如下:
diff 【option】... file1 file2 //file1和file2为要对比的文件
其中option为diff命令相关的操作,主要有:
-c:输出包含上下文环境的格式;
-u:以统一格式显示文件的不同;
-y: 以并列的方式显示文件的异同之处;
1.6 重定向
1.6.1 输出重定向
定义:将原本输出到标准输出的数据输出到其他的文件/设备中;输出重定向的使用如下:
cmd > file //cmd为命令,>为重定向操作符,file为指定文件;
在执行重定向操作的时候,如果目标文件不存在则会重新新建一个文件夹,如果目标文件已经存在的情况下,将会清空原始文件的内容再写入;重定向还有一种模式,与上述不同的是它不会覆盖原文件的内容,而是追加在已有文件后,其命令为:
cmd >> file //cmd为命令,>>为重定向操作符,file为指定文件;
1.6.1 输入重定向
定义:Shell命令不再从键盘读取用户输入的命令,而是从文件获取输入,称为输入重定向;输出重定向的使用如下:
cmd < file //cmd为命令,<为重定向操作符,file为指定文件;
可以通过输入重定向来生成当前文档,主要用于命令行有需要多行输入的情况;主要的用法:
cmd << delimiter //cmd为命令
document
delimiter //表示已经结束
例:
总结
不难发现,文件的操作在Linux系统中还是比较常见的,借助命令行工具也可以实现一些常见的功能,那么大家新年快乐,下期再见啦~