Linux foundation _ and compression file search

Disclaimer: This article is a blogger original article, reproduced, please declare the source! https://blog.csdn.net/weixin_42758707/article/details/90343351

Lecturer _ @ Wang Xiaochun

▼ File Finder

Finding qualified files on the file system

▷locate

The query system pre-built index file database
/var/lib/mlocate/mlocate.db

Depends on the index pre-built
index is constructed when the system is relatively idle automatic (periodic task), the administrator manually update the database (updatedb)
index building process needs to traverse the entire root file system, extreme consumption of resources

  • Work Features:
    • Find Fast
    • Fuzzy Lookup
    • Find non-real time
    • Search is a full path to the file, not just the file name
    • may only search user with read and execute permissions to the directory

locate command

locate KEYWORD

Useful options Note
-i Case-insensitive search
-n # List only the top N matches
-r Basic regular expressions

Example:

#搜索名称或路径中带有“conf”的文件
locate conf

#使用Regex来搜索以“.conf”结尾的文件
locate -r ‘\.conf$’

▷find

Real-Time Finder, to complete the path to the file specified by traversing Find

  • Work Features:
    • Find a slightly slower
    • pinpoint
    • Real Find
    • may only search for a user with read and execute permissions to the directory

find command

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

查找条件

搜索层级 根据属主、属组查找
-maxdepth level 最大搜索目录深度,指定目录为第1级 -user USERNAME 查找属主为指定用户(UID)的文件
-mindepth level 最小搜索目录深度 -group GRPNAME 查找属组为指定组(GID)的文件
-depth 先处理目录内的文件,再处理目录 -uid UserID 查找属主为指定的UID号的文件
根据文件名和inode查找: -gid GroupID 查找属组为指定的GID号的文件
-name “文件名称”:支持使用glob(*, ?, [], [^]) -nouser 查找没有属主的文件
-iname “文件名称”:不区分字母大小写 -nogroup 查找没有属组的文件
-inum n 按inode号查找 根据文件类型查找
-samefile name 相同inode号的文件 -type TYPE •f: 普通文件•d: 目录文件•l: 符号链接文件
•s:套接字文件•b: 块设备文件•c: 字符设备文件•p: 管道文件
-links n 链接数为n的文件 -empty 空文件或目录:find /app -type d -empty
-regex “PATTERN” 以PATTERN匹配整个文件路径,而非文件名称
根据文件大小来查找 根据权限查找
-size [+|-]# 常用单位:k, M, G,c(byte) -perm [/|-]MODE
根据时间戳 根据时间戳
-atime [+|-]# 以“天”为单位 -amin [+|-]# 以“分钟”为单位
-mtime [+|-]# 以“天”为单位 -mmin [+|-]# 以“分钟”为单位
-ctime [+|-]# 以“天”为单位 -cmin [+|-]# 以“分钟”为单位

根据文件大小来查找-size [+|-]#
在这里插入图片描述
示例:

#查找在20K-21K(不包括20K)间的文件
find / -size 21k
#查找在大于20M(不包括20M)的文件
find / -size +20M
#查找在小于10G(包括10G)的文件
find / -size -10G

根据时间戳-ctime [+|-]#
在这里插入图片描述
示例:

#查找访问时间超7天的文件
find / -atime +6
#查找访问时间在5天内(包括5天)的文件
find / -atime -6
#查找6天前那天访问时间的文件
find / -atime 6

根据权限查找-perm [/|-]MODE

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

示例:假设被查找的文件权限为654

-perm 备注
MODE MODE = 654 精确权限匹配
/MODE u>6或g>5或o>4 ugo任何一位大于即可
-MODE MODE > 654 MODE需要大于被匹配的文件

示例 2

#匹配权限模式恰好是755的文件
find /etc -perm 755
#只要当任意人有写权限时
find /etc -perm +222
#只有当每个人都有写权限时
find /etc -perm -222
#只有当其它人(other)有写权限时
find /etc -perm -002
  • 组合条件:
    与:-a
    或:-o
    非:-not !
  • 德·摩根定律:
    (非 A) 或 (非 B) = 非(A 且 B)
    (非 A) 且 (非 B) = 非(A 或 B)

示例:

!A -a !B = !(A -o B)
!A -o !B = !(A -a B)

处理动作

处理动作 注释
-print 默认的处理动作,显示至屏幕
-ls 类似于对查找到的文件执行“ls -l”命令
-delete 删除查找到的文件
-fls file 查找到的所有文件的长格式信息保存至指定文件中
-ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令,对于每个文件执行命令之前,都会交互式要求用户确认
-exec COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令
{} 用于引用查找到的文件名称自身
  • find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令
    参数替换xargs
    find和xargs的组合:find | xargs COMMAND
  • 由于很多命令不支持管道|来传递参数,而日常工作中有这个必要,所以就有了xargs命令
  • xargs用于产生某个命令的参数,xargs 可以读入 stdin 的数据,并且以空格符或回车符将 stdin 的数据分隔成为arguments
      注意:文件名或者是其他意义的名词内含有空格符的情况
      有些命令不能接受过多参数,命令执行可能会失败,xargs可以解决

find 示例

#查找本目录下名为snow.png的文件
find -name snow.png
#查找本目录下名为snow.png的文件,不区分大小写
find -iname snow.png
#查找根目录下后缀是txt的文件
find / -name “*.txt”
#查找/var目录下带有log的文件
find /var –name “*log*”
#查找本目录属于joe用户和joe组的文件
find -user joe -group joe
#查找本目录属于joe用户但不是joe组的文件
find -user joe -not -group joe
#查找本目录属于joe或是jane的文件
find -user joe -o -user jane
#查找本目录不是joe用户也不是jane的文件
find -not \( -user joe -o -user jane \)
#查找根目录下属于joe用户或者UID为500的文件
find / -user joe -o -uid 500
#找出/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"

#xargs示例:find和xargs格式:find | xargs COMMAND
ls f* |xargs rm
  • 查找有特殊权限的文件
#查找只要带有特殊权限SUID或SGID或STICKY的文件
find /bin/ -perm /7000 | xargs ls -l 
#查找带有特殊权限SUID和SGID和STICKY的3种权限文件
find /bin/ -perm -7000 | xargs ls -l 此命令和上面有何区别?

#备份配置文件,添加.orig这个扩展名
find -name “*.conf” -exec cp {} {}.orig \;
#提示删除存在时间超过3天以上的joe的临时文件
find /tmp -ctime +3 -user joe -ok rm {} \;
#在主目录中寻找可被其它用户写入的文件
find ~ -perm -002 -exec chmod o-w {} \;
#查找/data下的权限为644,后缀为sh的普通文件,增加执行权限
find /data –type f -perm 644 -name “*.sh” –exec chmod 755 {} \;
#查看/home的目录
find /home –type d -ls


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

硬链接不能压缩

compress/uncompress(.Z)

  • compress [-dfvcVr] [-b maxbits] [file ...]
选项 注释
-d 解压缩,相当于uncompress
-c 结果输出至标准输出,不删除原文件
-v 显示详情
  • uncompress file.Z 解压缩
  • zcat file.Z 不显式解压缩的前提下查看文本文件内容

gzip/gunzip (.gz)

  • 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

bzip2/bunzip2/bzcat (.bz2)

  • bzip2 [OPTION]... FILE ...
选项 注释
-k 保留原文件
-d 解压缩
-# 压缩比1-9,默认为9
  • bunzip2 file.bz2 解压缩
  • bzcat file.bz2 不显式解压缩的前提下查看文本文件内容

xz/unxz/xzcat (.xz)

  • xz [OPTION]... FILE ...
选项 注释
-k 保留原文件
-d 解压缩
-# 压缩比,取值1-9,默认为6
  • unxz file.xz 解压缩
  • xzcat file.xz 不显式解压缩的前提下查看文本文件内容

zip/unzip (.zip)

  • zip [OPTION] OUTPUTFILE INPUTFILE
选项 注释
-r 递归
-p 提取文件到标准输出
  • 解包解压缩:unzip sysconfig.zip

tar (.tar)

  • tar [OPTION]...OPFILE IPFILE
[OPTION] 注释
-c 创建
-C 更改解压目录
-p 提取有关文件权限的信息
-v 显示过程
-f 指定要操作的文件名(如果是创建则是创建指定文件名)
-r 附加文件档案尾
-t 列出存档内容
-x 提取存档
-j bzip2
-z gzip
-J xz

(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
tar -x -f /PATH/FILE.tar -C /PATH/

(5)直接打包+压缩当前文件夹下的所有文件tar.gz压缩包

tar -zcvf test.tar.gz ./*

(6)--exclude=file 排除文件

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

(7)-T | 从指定列表文件提取或创建
-X | 选项指定包含要排除的文件列表

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

解压

tar -xvf file.tar 		//解压 tar包
tar -xzvf file.tar.gz 	//解压tar.gz
tar -xjvf file.tar.bz2  //解压 tar.bz2
tar -xZvf file.tar.Z   	//解压tar.Z
unrar e file.rar 		//解压rar
unzip file.zip 			//解压zip

在这里插入图片描述

split:分割一个文件为多个文件

  • split -b SIZE -d IPFILE.tar OP-prefix-name
选项 注释
-b SIZE 指定每个文件大小
-d 使用数字后缀

示例:

#分割大的 tar 文件为多份小文件
`split -b 1M -d mybackup.tgz mybackup-parts`
`split -b 1M mybackup.tgz mybackup-parts`

#合并:
`cat mybackup-parts* > mybackup.tar.gz`

cpio:复制文件从或到归档

cpio命令是通过重定向的方式将文件进行打包备份,还原恢复的工具,它可以解压以“.cpio”或者“.tar”结尾的文件
cpio [选项] > 文件名或者设备名
cpio [选项] < 文件名或者设备名

选项 注释
-o 将文件拷贝打包成文件或者将文件输出到设备上
-O filename 输出到指定的归档文件名
-A 向已存在的归档文件中追加文件
-i 解包,将打包文件解压或将设备上的备份还原到系统
-I filename 对指定的归档文件名解压
-t 预览,查看文件内容或者输出到设备上的文件内容
-F filename 使用指定的文件名替代标准输入或输出
-d 解包生成目录,在cpio还原时,自动的建立目录
-v 显示打包过程中的文件名称

示例

#将etc目录备份:
find ./etc -print |cpio -ov >bak.cpio

#将/data内容追加bak.cpio
find /data | cpio -oA -F bak.cpio

#内容预览
cpio –tv < etc.cpio

#解包文件
cpio –idv < etc.cpio

▼练习

1、查找/var目录下属主为root,且属组为mail的所有文件
2、查找/var目录下不属于root、lp、gdm的所有文件
3、查找/var目录下最近一周内其内容修改过,同时属主不为root,也不是postfix的文件
4、查找当前系统上没有属主或属组,且最近一个周内曾被访问过的文件
5、查找/etc目录下大于1M且类型为普通文件的所有文件
6、查找/etc目录下所有用户都没有写权限的文件
7、查找/etc目录下至少有一类用户没有执行权限的文件
8、查找/etc/init.d目录下,所有用户都有执行权限,且其它用户有写权限的文件

▷练习答案

1、查找/var目录下属主为root,且属组为mail的所有文件

find /var -user root -a -group mail -ls

2、查找/var目录下不属于root、lp、gdm的所有文件

find /var -not \( -user root -o -user lp -o -user gdm \) -ls

3、查找/var目录下最近一周内其内容修改过,同时属主不为root,也不是postfix的文件

find /var -mtime -7 -a -not -user root -a -not -user postfix -ls

4、查找当前系统上没有属主或属组,且最近一个周内曾被访问过的文件

find / -nouser -a -nogroup

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

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

6、查找/etc目录下所有用户都没有写权限的文件

find /etc  -not -perm /111 -ls

7、查找/etc目录下至少有一类用户没有执行权限的文件

find /etc -not -perm -111 -ls

8、查找/etc/init.d目录下,所有用户都有执行权限,且其它用户有写权限的文件

find /etc/init.d -perm -111 -a -perm -002 -ls

Guess you like

Origin blog.csdn.net/weixin_42758707/article/details/90343351