linux 文件查找和打包压缩


目录

locate

find

打包压缩

locate,非实时查找(也叫数据库查找)

locate会查询系统上的文件索引数据库/var/lib/mlocate/mlocate.db

文件索引数据库在系统空闲的时候自动创建更新,也可手动执行updatedb命令更新,centos7默认不带updatedb命令,需要安装(yum install -y mlocate)

索引构建的过程中很消耗系统资源,需要遍历整个文件系统。不建议在生产中使用,或者在服务器不忙的时候创建

locate工作特点

  • 查找速度快(基于文件索引数据库)
  • 模糊查找
  • 非实时查找
  • 搜索的是文件的全路径,不仅仅是文件名
  • 可能只能搜索到用户具读取或执行权限的目录

locate常用选项

-i   不区分大小写搜索
-n N 只列出前边N个搜索到的项目
-r   使用基本正则表达式

 更新创建文件索引数据库

[root@Centos7 ~]# updatedb

 查找路径或文件名中包含lidawei的文件

[root@Centos7 ~]# locate -i lidawei

 显示查找结果的前三个

[root@Centos7 ~]# locate -n 3 -i lidawei

 根据正则表达式查找

[root@Centos7 /]# locate -r "\"

find  实时查找工具,通过遍历路径完成文件查找

工作特点

  • 相比于locate,查找速度较慢
  • 精确查找
  • 实时查找
  • 查找条件丰富
  • 可能只搜索出用户具有读取和执行权限的目录

格式

find [查找路径] [查找条件] [处理动作]

指定搜索目录层级

find /etc/ -maxdepth 2                # 搜索最大目录层级2
find /etc/ -mindepth 2                # 搜索最小目录层级2
find /etc/ -mindepth 2 -maxdepth 2    # 目录层级指定2

对搜索出来的结果,优先显示目录中的文件,其次是目录

find /data -depth

 根据文件名和inode号查找

find /etc/ -name "nginx.conf"         # 查找/etc下名字是nginx.conf的文件
find /etc/ -iname "nginx.conf"        # 跟据名字查找,不区分大小写
find /etc/ -inum 723799               # 查找inode号为723799的文件
find / -samefile nginx.conf           # 查找和nginx.conf相同inode号的文件
find /etc/ -links 5                   # 查找链接数是5的文件
find /etc/ -regex ".*nginx.conf$"     # 使用正则表达式匹配。只能匹配整个文件路径,不能单独匹配文件名

根据属主,属组查找文件

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

根据文件类型查找

-type TYPE
TYPE可以是以下形式:
f: 普通文件
d: 目录文件
l: 符号链接文件
s:套接字文件
b: 块设备文件
c: 字符设备文件
p: 管道文件

查找空文件或目录

find /etc/ -empty    # 查看/etc下的空文件和空目录

组合条件查询

与:-a
或:-o
非:-not  !
find /etc -type d -a -empty               # 查看/etc/下的空目录
find /etc/ -type d -o -type l             # 查看/etc/下目录或链接文件
find /etc -not \( -type d -a -empty \)    # 查看/etc/下的非空目录

 排除目录

find /etc/ -path "/etc/security" -a -prune -o -name "*.conf"   # 查找/etc/下除了/etc/security目录外所有的.conf结尾的文件

排除多个目录

find /etc/ \( -path "/etc/security" -o -path "/etc/systemd" \) -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,∞) 
find -size 1000M   # 查找当前目录下999M以上到1000M的文件
find -size -1000M  # 所有小于1000M的文件
find -size +1000M  # 所有大于1000M的文件 

 根据时间查找,linux中的文件有三种时间

  • atime    访问时间,文件被访问的最后时间
  • mtime   修改时间,文件内容被修改的最后时间
  • ctime    变化时间,文件的元数据发生变化的时间,如权限,所属用户等
find /etc/ -atime 10    # 查看访问时间10-11天
find /etc/ -mtime +10   # 查看10天以外
find /etc/ -mtime -10   # 查看10天以内

-amin # 访问时间,以分钟为单位
-mmin
-cmin

 根据权限查找

-perm [/|-MODE]

MODE # 精确权限匹配
/MODE # 任何一类对象的权限只要能和MODE匹配以为即可,或关系
-MODE # 每一类对象必须同事拥有指定权限,与关系

find /etc/ -perm 600 # 查看权限指定是600的文件
find /etc/ -perm /600  # 权限或,能匹配到400,600222,666等等
find /etc/ -perm -600  # 权限与,能匹配到600,666622,644等等

 处理动作

-print:默认的处理动作,显示至屏幕

-ls:类似于对查找到的文件执行"ls -dils"命令格式输出
find /etc/ -name "*.conf" -ls

-fls file:查找到的所有文件的长格式信息保存至指定文件中
find /etc/ -name "*.conf" -fls 1.txt     

-delete:删除查找到的文件,慎用!

-ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令,对于每个文件执行命令之前,都会
交互式要求用户确认

-exec COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令
{}: 用于引用查找到的文件名称自身
find /etc/ -name "*.conf" -exec cp {} /home/jiji \;

参数替换xargs

很多命令不支持使用管道传递参数,xargs可以读取stdin的参数,并且以空格符或回车符将stdin的数据分割成参数

seq 10 | xargs       # 显示10个数字
seq 10 | xargs -n1   # 将10个数字分隔为10个参数

ls
| xargs rm # 删除当前目录下的大量文件
echo user{
1..10} | xargs -n1 useradd # 批量创建用户 echo user{1..10} | xargs -n1 userdel -r # 批量删除用户 find -type f -name "*.txt” -print0 | xargs -0 rm # 如果文件名中带空格,以字符nul分隔

 find练习

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目录下,所有用户都有执行权限,且其它用户有写权限的文件

打包压缩

压缩是对单个文件进行压缩,而非目录

几种常用的压缩工具

gzip和unzip,来自gzip包,压缩后文件后缀.gz

-k keep, 保留原文件,CentOS 8 新特性
-d 解压缩,相当于gunzip
-c 结果输出至标准输出,保留原文件不改变
-# 指定压缩比,#取值为1-9,值越大压缩比越大
#解压缩
gunzip file.gz
#不显式解压缩的前提下查看文本文件内容
zcat file.gz

 bzip2和bunzip2,来自bzip2包,压缩后文件后缀.bz2

-k keep, 保留原文件
-d 解压缩
-c 结果输出至标准输出,保留原文件不改变
-# 1-9,压缩比,默认为9
bunzip2 file.bz2 解压缩
bzcat file.bz2 不显式解压缩的前提下查看文本文件内容

 xz和unzx,来自xz包,压缩后文件后缀是.xz

-k keep, 保留原文件
-d 解压缩
-c 结果输出至标准输出,保留原文件不改变
-# 压缩比,取值1-9,默认为6
unxz file.xz #解压缩
xzcat file.xz #不显式解压缩的前提下查看文本文件内容

zip和unzip

zip命令可以实现打包目录和多个文件成一个文件并压缩,但可能会丢失文件属性信息,所以一般用tar工具代替

#打包并压缩
zip -r /backup/sysconfig.zip /etc/sysconfig/

#不包括目录本身,只打包目录内的文件和子目录
cd /etc/sysconfig; zip -r /root/sysconfig.zip *

#默认解压缩至当前目录
unzip /backup/sysconfig.zip

#解压缩至指定目录,如果指定目录不存在,会在其父目录(必须事先存在)下自动生成
unzip /backup/sysconfig.zip -d /tmp/config
cat /var/log/messages | zip messages -

#-p 表示管道
unzip -p message.zip > message

tar

tar可以将目录和多个文件打包成一个文件,并且可以配合压缩工具压缩,保留文件属性不丢失。常用于备份,tar对应的文件是.tar后缀

1 创建归档,保留权限

tar -cpvf etc.tar /etc/

2 追加文件至归档,但不支持对压缩文件的追加

tar -rf etc.tar test

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

tar -t -f etc.tar

4 展开归档

tar xf etc.tar -C /home

5 结合压缩工具一起使用

tar zcvf 123.tar.gz /etc/

# 打包的时候排除某个目录
tar zcvf /home/123.tar.gz --exclude=/etc/default /etc
-z 相当于gzip压缩工具
-j 相当于bzip2压缩工具
-J 相当于xz压缩工具