五、文件查找压缩及文本处理SED

一、文件查找工具

locate 非实时查找(数据库查找),模糊匹配
依赖建立数据库索引:updatedb命令
/var/lib/mlocate/mlocate.db 数据库文件
索引构建过程需要遍历整个根文件系统,极消耗资源
特点:

  • 查找速度快
  • 模糊查找
  • 非实时查找
  • 搜索的是文件的全路径,不仅仅是文件名
  • 可能只搜索用户具备读取和执行权限的目录
    选项
    -i 不区分大小写的搜索
    -n N 只列举前N个匹配项目
    -r 使用基本正则表达式

find 实时查找工具,通过遍历指定路径完成文件查找
特点:

  • 查找速度略慢
  • 精确查找
  • 实时查找
  • 可能只搜索用户具备读取和执行权限的目录

语法:find [OPTION]... [查找路径] [查找条件] [处理动作]
查找路径:指定具体目标路径;默认为当前目录且递归
查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件
处理动作:对符合条件的文件做操作,默认输出至屏幕

查找条件
指定搜索层级
-maxdepth level 最大搜索目录深度,指定目录下的文件为第1级
-mindepth level 最小搜索目录深度

先处理目录内的文件,再处理指定目录
-depth

根据文件名和inode查找
-name "文件名称":支持使用glob
*, ?, [], [^]
-iname "文件名称":不区分字母大小写
-inum n 按inode号查找
-samefile name 相同inode号的文件
-links n 链接数为n的文件
-regex “PATTERN”:以PATTERN匹配整个文件路径,而非文件名称

根据属主、属组查找
-user USERNAME:查找属主为指定用户(UID)的文件
-group GRPNAME: 查找属组为指定组(GID)的文件
-uid UserID:查找属主为指定的UID号的文件
-gid GroupID:查找属组为指定的GID号的文件
-nouser:查找没有属主的文件
-nogroup:查找没有属组的文件

根据文件类型查找:
-type TYPE
f: 普通文件
d: 目录文件
l: 符号链接文件
s:套接字文件
b: 块设备文件
c: 字符设备文件
p: 管道文件

空文件或目录:
-empty
示例:

find /app -type d -empty

组合条件:
与:-a
或:-o
非:-not !
德·摩根定律:
(非 A) 或 (非 B) = 非(A 且 B)
(非 A) 且 (非 B) = 非(A 或 B)
示例:
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)

find示例
找出/tmp目录下,属主不是root,且文件名不以f开头的文件

find /tmp \( -not -user root -a -not -name 'f*' \) -ls

find /tmp -not \( -user root -o -name 'f*' \) -ls

排除目录示例:
查找/etc/下,除/etc/sane.d目录的其它所有.conf后缀的文件

find /etc -path '/etc/sane.d' -a –prune -o -name "*.conf"

查找/etc/下,除/etc/sane.d和/etc/fonts两个目录的所有.conf后缀的文件

find /etc \\( -path "/etc/sane.d" -o -path "/etc/fonts" \) -a -prune -o -name "*.conf"

根据文件大小来查找:
-size [+|-]#UNIT
常用单位:k, M, G,c(byte)
#UNIT: (#-1, #]
如:6k 表示(5k,6k]
-#UNIT:[0,#-1]
如:-6k 表示[0,5k]
+#UNIT:(#,∞)
如:+6k 表示(6k,∞)

示例:
查找/etc目录下大于1M且类型为普通文件的所有文件

find /etc -size +1M -a -type f

根据时间戳:
以“天”为单位
-atime [+|-]#,
#: [#,#+1)
+#: [#+1,∞]
-#: [0,#)
-mtime
-ctime
以“分钟”为单位
-amin
-mmin
-cmin

根据权限查找:
-perm [/|-]MODE
MODE: 精确权限匹配
/MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可,或关系,+ 从centos7开始淘汰
-MODE:每一类对象都必须同时拥有指定权限,与关系
0 表示不关注

  • find -perm 755 会匹配权限模式恰好是755的文件
    只要当任意人有写权限时,find -perm +222就会匹配
    只有当每个人都有写权限时,find -perm -222才会匹配
    只有当其它人(other)有写权限时,find -perm -002才会匹配

处理动作
-print:默认的处理动作,显示至屏幕
-ls:类似于对查找到的文件执行“ls -l”命令
-delete:删除查找到的文件
-fls file:查找到的所有文件的长格式信息保存至指定文件中
-ok COMMAND {} ; 对查找到的每个文件执行由COMMAND指定的命令,对于每个文件执行命令之前,都会交互式要求用户确认
-exec COMMAND {} ; 对查找到的每个文件执行由COMMAND指定的命令
{}: 用于引用查找到的文件名称自身,完整路径

find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令

参数替换xargs
由于很多命令不支持管道|来传递参数,xargs用于产生某个命令的参数,xargs 可以读入 stdin 的数据,并且以空格符或回车符将 stdin 的数据分隔成为参数。
许多命令不能接受过多参数,命令执行可能会失败,xargs可以解决
注意:文件名或者是其他意义的名词内含有空格符的情况
find和xargs的组合:find | xargs COMMAND

示例:
1.删除当前目录下的大量文件

ls | xargs rm

2.创建10个用户,指定每次传递的参数为1个

echo user{1..10} | xargs -n1 useradd

3.find命令执行结果以0作为分隔符传递标准输入参数,默认为空格

find -type f -name "*.txt" -print0 | xargs -0 rm

二、压缩、解压缩及归档工具

  • file-roller(图形工具)
  • compress/uncompress: .Z
  • gzip/gunzip: .gz
  • bzip2/bunzip2: .bz2
  • xz/unxz: .xz
  • zip/unzip
  • tar
  • cpio

命令:gzip/gunzip
语法:gzip [OPTION]... FILE ...
选项:
-d 解压缩,相当于gunzip
-c 结果输出至标准输出,保留原文件不改变
-# 指定压缩比,#取值为1-9,值越大压缩比越大

命令:gunzip file.gz 解压缩
           zcat file.gz 不显式解压缩的前提下查看文本文件内容
示例:
gzip -c messages > messages.gz
gzip -c -d messages.gz > messages
zcat messages.gz > messages
cat messages | gzip > m.gz

tar工具
tar(Tape ARchive,磁带归档的缩写)
语法:tar [OPTION]…
选项:
-exclude 排除文件
-T 选项指定输入文件 -X 选项指定包含要排除的文件列表

常用示例:

  1. 创建归档,保留权限
tar -cpvf /PATH/FILE.tar FILE...

2.追加文件至归档: 注:不支持对压缩文件追加

tar -r -f /PATH/FILE.tar FILE...

3.查看归档文件中的文件列表

tar -t -f /PATH/FILE.tar

4.展开归档

tar -x -f /PATH/FILE.tar

-C选项,指定解包的目录

tar -x -f /PATH/FILE.tar -C /PATH/

5.结合压缩工具实现:归档并压缩
使用-j: bzip2, -z: gzip, -J: xz选项
打包/etc/目录下面所有conf结尾的文件,压缩包名称为当天的时间,并拷贝到/usr/local/src目录备份。

find /etc -name *.conf |xargs tar zcvf $(date +%Y%m%d%H%M).tar;cp $(date +%Y%m%d%H%M).tar /usr/local/src/

6.将/app目录下的文件进行归档压缩,排除/app/host1、/app/host2文件夹

tar zcvf /root/a3.tgz --exclude=/app/host1 --exclude=/app/host2 /app

7.将/app目录下的文件进行归档压缩,指定包含和排除文件

tar zcvf mybackup.tgz -T /root/includefilelist -X /root/excludefilelist

三、文本处理三剑客之SED
       sed(Stream EDitor, 行编辑器)是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。如果没有使诸如'D'的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
功能:主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等

用法:
sed [option]... 'script' inputfile...
常用选项:
-n 不输出模式空间内容到屏幕,即不自动打印
-e 多点编辑
-f /PATH/SCRIPT_FILE 从指定文件中读取编辑脚本
-r 支持使用扩展正则表达式
-i.bak 备份文件并原处编辑
script:
'地址命令'

地址定界:
(1) 不给地址:对全文进行处理
(2) 单地址:
#:指定的行,$:最后一行
/pattern/:被此处模式所能够匹配到的每一行
(3) 地址范围:
#,#
#,+#
/pat1/,/pat2/
#,/pat1/
(4) ~:步进
1~2 奇数行
2~2 偶数行

编辑命令:
d 删除模式空间匹配的行,并立即启用下一轮循环
p 打印当前模式空间内容,追加到默认输出之后
a []text 在指定行后面追加文本,支持使用\n实现多行追加
i []text 在行前面插入文本
c []text 替换行为单行或多行文本
w /path/file 保存模式匹配的行至指定文件
r /path/file 读取指定文件的文本至模式空间中匹配到的行后
= 为模式空间中的行打印行号
! 模式空间中匹配行取反处理

s /// 查找替换
支持使用其它分隔符,s@@@,s###

替换标记:
g 行内全局替换
p 显示替换成功的行
w /PATH/FILE 将替换成功的行保存至文件中

示例:

  1. 取出ifconfig命令中本机的IPv4地址
ifconfig eth0 |sed -nr '2s/^[^0-9]+([0-9.]+).*$/\1/p'
  1. 删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符
sed -nr 's/^#[[:space:]]+(.*)/\1/p' /etc/fstab
  1. 处理/etc/fstab路径,使用sed命令取出其目录名和基名
echo /etc/fstab |sed -r 's@(^/.*/)([^/]+)/?$@\1\n\2@'