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,600,222,666等等 find /etc/ -perm -600 # 权限与,能匹配到600,666,622,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压缩工具