1、linux 中包含大量的文件,对于文件查找,linux 提供了 find 命令。
find 是一个非常有效的工具,它可以遍历目标目录甚至整个文件系统来查找某些文件或目录:
|
|
其中 expression 包括三种:options、tests 和 actions。多个表达式之间被操作符分隔,当操作符被省略时,表示使用了默认操作符 -and。
当表达式中不包含任何 actions 时,默认使用 -print,也就是打印出搜索到的所有文件,用换行分隔。
其实可以将三种表达式均视为选项,表示对搜索的某种限制 (如 -maxdepth 表示搜索路径的最大深度)、或对找到的目标文件的某种测试 (如 -readable 判断是否可读)、或对结果采取的某种动作 (如 -print)。
选项 -name pattern 搜索文件名:
|
|
此例中搜索目录 /root 下所有文件,找出匹配 file? 的文件名,同时由于没有指定 action,所以使用默认的 -print 将结果打印出来。find 命令中,搜索路径和某些文件名的表示可以使用 shell 通配符 (见上一篇),但为了避免混淆,处于选项后的通配符需要被引号引起来。
选项 -maxdepth n 指定搜索路径的最大深度:
|
|
本例中指定最大深度为 1,表示只搜索 /root 目录,而不进入任何它的子目录去搜索。
和此选项相对应,-mindepth 表示指定搜索路径的最小深度。
选项 -user name 按照文件属主来查找文件:
|
|
或者类似选项 -uid n 表示按文件属主的 uid,-gid n 表示按文件所属组的 gid,-group name 表示按文件所属组。
选项 -mtime n 文件上次内容被修改距离现在 n*24 小时:
|
|
本例中使用了命令 ls 的选项 -t 对文件的时间进行排序,最近被修改的文件在前。选项 -mtime n 中 n 可以表示成:
- +n 表示大于 n
- -n 表示小于 n
- n 表示等于 n
还有其他时间 (如 atime,ctime) 的比较,用法相同。
选项 -newer file 表示搜索到的文件比指定的 file 要‘新’(上次内容被修改离现在时间更短):
|
|
选项 -path pattern 文件名匹配 pattern(通配符):
|
|
注意 pattern 匹配时不会对 / 和. 进行特殊处理。
通常 -path 会配合选项 -prune 使用,表示对某目录的排除:
|
|
这里的 -o 表示或者,它和之前所说的 -and 都是操作符。表示表达式之间的逻辑关系。本例中可以理解为:如果目录匹配./tmp 则执行 -prune 跳过该目录,否则匹配 -name 指定的文件并执行 -print。
除这两个操作符外,操作符! 或 -not 表示逻辑非,操作符 (…) 和数学运算中的括号类似,表示提高优先级:
|
|
注意这里的 (…) 操作符需要被转义(为避免被 shell 解释为其他含义),在符号前加上反斜线’\’。(关于 shell 中的转义或引用我们会在讲 bash 编程时详述)
选项 -type x 表示搜索类型为 x 的文件,其中 x 的可能值包括 b、c、d、p、f、l、s。它们和命令 ls 显示的文件类型一致 (见基础命令介绍一),f 代表普通文件。
|
|
选项 -perm mode 表示搜索特定权限的文件:
|
|
或表示成:
|
|
选项 -size n 表示搜索文件大小
|
|
此例中 + 100c 表示当前目录下大于 100 bytes 的文件,n 和前面表示时间的方式类似 (+n,-n,n),n 后面的字符还包括:
|
|
选项 -print0 类似 -print 输出文件名,但不用任何字符分隔它们。当文件名中包含特殊字符时使用。可以配合带选项 -0 的命令 xargs 一起使用 (后述)。
选项 -exec command ; 表示要执行的命令
-exec 后可以跟任意 shell 命令来对搜索到的文件做进一步的处理,在 command 和分号之间都被视为 command 的参数,其中用 {} 代表被搜索到的文件。分号需要被转义。
如对搜索到的文件执行命令 ls -l:
|
|
-exec 选项后的命令是在启动 find 所在的目录内执行的,并且对于每个搜索到的文件,该命令都执行一次,而不是把所有文件列在命令后面只执行一次。
举例说明下其中的区别:
|
|
当使用格式 -exec command {} + 时表示每个文件都被追加到命令后面,这样,命令就只被执行一次了:
|
|
但有时会出现问题:
|
|
因为这里文件被追加于目录 abcd / 的后面,导致报错。
同时,使用格式 -exec command {} + 还可能会造成被追加的文件数过多,超出了操作系统对命令行长度的限制。
使用 -exec 可能会有安全漏洞,通常使用管道和另一个命令 xargs 来代替 -exec 执行命令。
2、xargs 从标准输入中获得命令的参数并执行
xargs 从标准输入中获得由空格分隔的项目,并执行命令 (默认为 /bin/echo)
选项 -0 将忽略项目的分隔符,配合 find 的选项 -print0,处理带特殊符号的文件。
|
|
当不用时:
|
|
选项 -I string 为输入项目指定替代字符串:
|
|
这里的意思是说使用 -I 后面的字符串去代替输入项目,这样就可以把它们作为整体放到命令的任意位置来执行了。也避免了 -exec command {} + 的错误。
选项 -d 指定输入项目的分隔符:
|
|
选项 -P 指定最大进程数,默认进程数为 1,多个进程并发执行。
3、date 打印或设置系统时间
|
|
当没有任何参数时表示显示当前时间:
|
|
选项 -d string 按描述字符串显示时间 (例子中字符串表示距离 1970-01-01 零点的秒数):
|
|
或者:
|
|
-d 后面的字符串还可以是:
|
|
表示昨天
又如明年表示为:
|
|
选项 -s 设置系统时间:
|
|
由于 linux 系统启动时将读取 CMOS 来获得时间,系统会每隔一段时间将系统时间写入 CMOS,为避免更改时间后系统的立即重启造成时间没有被写入 CMOS,通常设置完时间后会使用命令 clock -w 将系统时间写入到 CMOS 中。
date 命令中由 FORMAT 来控制输出格式,加号 + 在格式之前表示格式开始:
|
|
本例中格式被双引号引起来以避免被 shell 误解,其中:
|
|
还可以指定很多其他格式如只输出当前时间:
|
|
如输出距离 1970-01-01 零点到现在时间的秒数:
|
|
如输出今天星期几:
|
|
其他格式请自行 man
4、gzip 压缩或解压文件
|
|
当命令后直接跟文件时,表示压缩该文件:
|
|
压缩后的文件以. gz 结尾,gzip 是不保留源文件的
选项 -d 表示解压缩
|
|
选项 -r 可以递归地进入目录并压缩里面的文件
选项 -n 指定压缩级别,n 为从 1-9 的数字。1 为最快压缩,但压缩比最小; 9 的压缩速度最慢,但压缩比最大。默认时 n 为 6。
|
|
当 gzip 后没有文件或文件为 - 时,将从标准输入读取并压缩:
|
|
注意例子中 gzip 的输出被重定向到文件 hello.gz 中,如果对此文件进行解压,将会生成文件 hello。如果被重定向的文件后缀不是. gz,文件名在被改成. gz 后缀之前将不能被解压。
5、zcat 将压缩的文件内容输出到标准输出
|
|
zcat 读取被 gzip 压缩的文件,只需文件格式正确,不需要文件名具有. gz 的后缀。
6、bzip2 压缩解压文件
|
|
命令 bzip2 和 gzip 类似都是压缩命令,只是使用的压缩算法不一样,通常 bzip2 的压缩比较高。本命令默认同样不保留源文件,默认文件名后缀为. bz2:
|
|
选项 -k 可使源文件保留:
|
|
选项 -d 表示解压 (若存在源文件则报错):
|
|
选项 -f 表示强制覆盖源文件:
|
|
选项 -n 和 gzip 用法一致,表示压缩比。
7、tar 打包压缩文件
|
|
命令 gzip 和 bzip2 均不支持压缩目录 (虽然 gzip 可以用选项 -r 到目录内去压缩,但仍无法压缩目录),用 tar 命令可以将目录归档,然后利用压缩命令进行压缩:
|
|
例子中选项 -c 表示创建打包文件,-f tmp.tar 表示指定打包文件名为 tmp.tar,后面跟被打包目录名 tmp/。
选项 -t 列出归档内容
选项 -v 详细地列出处理的文件
|
|
选项 -u 更新归档文件 (update)。
|
|
选项 -x 对归档文件进行提取操作。(解包)
|
|
选项 -O 解压文件至标准输出
|
|
选项 -p 保留文件权限 (用于解包时)。
选项 -j、-J、-z 用于压缩。
其中 -j 使用命令 bzip2,-J 使用命令 xz,-z 使用命令 gzip 分别将归档文件进行压缩解压处理 (命令 tar 后的选项可以省略 -):
|
|
本例中分别使用三种压缩格式进行压缩,可以看到使用命令 bzip2 的压缩比最高,命令 gzip 的压缩比最低。在执行压缩文件时,压缩时间也是我们考量的一个重要因素。默认时,使用 gzip 最快,xz 最慢。
对于这三种格式的压缩文件进行解压,只需将选项中 -c 换成 -x 即可。
选项 -X FILE 排除匹配文件 FILE 中所列模式的文件:
|
|
注意文件 FILE 中支持通配符匹配:
|
|
选项 -C DIR 改变至目录 DIR(用于解包时):
|
|
只解压指定文件:
|
|
注意这里解压时,指定文件不能在选项 -C 之前
如不想解压压缩包,但想查看压缩包中某个文件的内容时,可以使用如下技巧:
|
|
本文讲述了linux中关于文件搜索和归档压缩等相关的命令及部分选项用法,都是在系统管理过程中经常要使用的。需熟练使用。