文章目录(Table of Contents)
简介
在 Linux 文件与目录 中,我们介绍了文件的相关属性。在这一篇文章中,我们会介绍根据文件的属性值或是其他参数条件进行文件的查找,同时简单介绍文件的打包操作。
在文件查找部分,我们将展示如何使用下面的条件去查找一些文件:
- 文件名包含某些文本(或是匹配某个模式,这个是最常用的);
- 文件在一段时间内被使用(time);
- 根据文件的大小进行搜索(size);
- 文件属于某种类型(普通文件,目录);
- 文件属于某个用户(owner);
- 文件具有一定的访问权限(file mode bits);
- 对查找出来的文件执行操作(exec);
- which 命令;
文件的查找
find
命令用于在目录下查找文件,并且会打印所找到文件的信息。find
命令的使用方法如下:
- find [path...] [expression]
这里的 [expression]
会在后面的例子中详细介绍。
根据文件名进行搜索
对于常用的 find
命令来说,可以通过一个包含特殊字符串的 shell 模式(Shell Pattern)
去比较文件名或者部分文件名。 这里的特殊字符串又被称为 通配符(wildcards)
,通配符是一些特殊字符,又被称为 元字符(metacharacters)
,在后面的内容中我们统一称为 通配符
。下面是几个常见的 shell pattern
中用到的通配符(为了跟一般命令参数做区分,在使用通配符的时候,通常需要使用 引号
):
*
: 匹配0
个或多个字符;?
: 匹配任意1
个字符;[string](中括号)
:匹配string
字符串中的任意一个字符,如[abc]
匹配abc
三个字符中的任意一个,[a-z0-9]
匹配小写字母和数字。\(反斜杠)
:移除特殊字符的特殊含义,转义
find
命令有两个基础名称模式:
-name
:指定名称;-iname
:指定名称忽略大小写;
例如下面的命令表示查找「当前目录」下,以字母 e
开头,.py
结尾的文件(这里使用了 -name
,是区分大小写的):
- find ./ -name "e*.py"
运行上面的命令,最终结果如下图所示:
查找一段时间内被使用的文件
每个文件都有三个时间戳(部分系统还会有文件的创建时间,例如 windows),分别为:
- 访问(上一次访问文件的时间);
- 更改(改变文件或其属性的时间);
- 修改(修改文件内容的时间);
下面我们将介绍 find
命令中使用到这些时间戳的参数:
-atime n
测试项- 文件上一次访问时间是在
n*24
小时之前。 - 需要注意的是,如果我们使用的
n
值为0
,则向下取整,意味着距离上一次访问文件时间不足24
小时。 - 同样
n
是数值参数,可以是-n
和+n
- 文件上一次访问时间是在
-ctime n
测试项- 这里代表的是状态的改变,文件上一次属性修改的时间是在
n*24
小时之前;
- 这里代表的是状态的改变,文件上一次属性修改的时间是在
-mtime n
测试项- 这里代表文件内容被修改,文件上一次修改时间是在
n*24
小时之前;
- 这里代表文件内容被修改,文件上一次修改时间是在
为了方便记忆,我们可以将英文单词关联起来,这里的 a
是access
,c
为 change
,而 m
则为 modify
。
除了用 24
小时计数之外,我们还可以细化到 minute
多少分钟,与上面对应的参数应该为:
-amin n
-cmin n
-mmin n
如下示例,我们查找当前目录下,修改文件的时间在 5
分钟 到 24
小时之间(下面 mmin +5
表示 5
分钟之前,mtime 0
表示 24
小时以内):
- find ./ -mtime 0 -mmin +5
下面是运行的截图,我们在 5
分钟前创建的 1.txt
文件可以被找出来:
根据文件大小查找文件
文件的大小也是文件的属性中很重要的一栏,这里在 find
中加上参数 -size n[bckwMG]
。这里的 n
是数据参数,b
代表块 block
,c
代表字节,k
代表 1024 字节,即 kb,w
代表字符数量(2-byte 的字符),M
代表兆字节,G
代表千兆字节。
例如,查找当前目录下的小于 100k
的文件。
- find -size -100k
根据文件类型进程查找
我们还可以在搜索过程中加上文件类型的限制,使用 -type
来加上文件类型。可以有以下的三种类型选择:
d
目录f
普通文件l
符号链接
例如,我们查找在当前目录下,文件大小大于 30k,且 24 小时内被修改过的,普通文件:
- find ./ -mtime 0 -size +30k -type f
根据文件所属用户查找
我们还可以在搜索中加上用户或是用户组的限制。分别使用 -user uname
来指定用户,使用 -group gname
来指定所属组的名称。
例如下面的例子查找当前目录下所属用户为 mathpretty
的文件:
- find -user mathpretty
根据文件权限查找
我们还可以根据文件的权限对文件进行查找,共有三种权限(下面的三种权限都是针对当前用户对该文件是否有对应的权限):
-readable
, 可读;-writable
, 可写;-executable
, 可执行;
例如,下面的例子查找当前用户对当前目录下有可写权限,同时 txt
结尾的文件:
- find ./ -writable -name "*txt"
对查找的文件执行操作
我们一般查找出来文件并不仅仅是看看而已,还会有进一步的操作,这个时候就要用到 -exec
选项。-exec
选项后面紧跟要执行的命令或脚本,然后是 {}
、空格和 \;
。
考虑到各个系统中 ;
有不同的意义,所以前面要加反斜杠。有时使用这一选项是为了查找文件并删除它们。建议在真正执行删除之前,先确认一下。
例如,我们想要显示查找文件的详细信息:
- find ./ -type f -mtime 0 -exec ls -l {} \;
或是删除对应的文件,并在删除前进行确认(这里把-exec
替换为-ok
,按 y
键删除文件,按 n
键不删除):
which 命令
which
命令一般用于查找 shell
命令的完整路径。该命令在环境变量PATH
中列出的目录中搜索可执行文件或脚本进行匹配查找。常用的如 -a
参数,代表列出所有匹配的查找结果,而不仅仅是第一个。
示例如下,查找 python
可执行文件的路径:
文件的打包
在 linux
中,支持的压缩命令是非常多的,并且不同的压缩命令所使用的压缩机制也不尽相同,再加上很多比较老的压缩方式如 zip
等已经不常用了。不同于文件查找的描述,对于这一部分的内容,我们仅简单介绍两个常用的操作。
gzip 对文件压缩
gzip
命令用于对文件进行压缩,生成的压缩文件会以 .gz
结尾。而对应的解压缩的命令则是 gunzip
。两个命令的使用格式情况如下:
- gzip -v file
- gunzip -v file
例如下面的例子中,我们对文件 1
进行压缩,文件会变为 1.gz
:
tar 对一系列文件打包
tar
是用于创建文件档案的命令行工具,多用于备份文件。顾名思义,tar
命令可以将一系列的文件打包到一个大文件中,也可以将大文件解包以恢复数据。下面,我们将介绍 tar
的常用参数。tar
命令的格式大致如下:
- tar [OPTION...] [FILE]
其中 option
可以有以下的选项:
-c
或--create
:创建一个存档;-r
:将文件附加到档案文件末尾;-z
或--gzip
:指定gzip
格式;-v
或--verbose
:显示文件处理的详细过程;-f
:指定档案文件名称;-x
:还原档案文件;
例如现在文件夹下,有两个文件 4
和 5
,还有一个文件夹 test
,test
文件夹下有文件 1
,2
和 3
,如下所示:
- ./
- ├── 4
- ├── 5
- └── test
- ├── 1
- ├── 2
- └── 3
- 1 directory, 5 files
我们使用 tar
命令将这 5 个文件归档到 test.tar
中。
- tar -cvf test.tar *
可以看到多了一个 test.tar
文件:
如果需要解压,则使用 x
这个参数,如下所示:
- tar -xvf test.tar
打包与解压 rar 文件
一般通过默认安装的 ubuntu
是不能解压 rar
文件的,只有在安装了 rar
解压工具之后,才可以解压。我们通过下面的命令来安装 rar
工具:
- sudo apt-get install rar # 压缩
- udo apt-get install unrar # 解压
安装完毕之后,我们按照下面的用法进行压缩和解压:
- rar x FileName.rar # 解压
- rar a FileName.rar DirName # 压缩
其中 a
表示 Add files to archive
,x
表示 Extract files with full path
。
解压 Zip 文件
首先我们需要安装解压软件:
- sudo apt-get install unzip
接着就可以使用 unzip
命令对文件进行解压(下面的例子将文件解压到指定文件夹下):
- unzip file.zip -d destination_folder
- 微信公众号
- 关注微信公众号
- QQ群
- 我们的QQ群号
评论