文章目录(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群号
-









评论