Linux_6_文件查找与打包压缩

目录

  • 文件查找与打包压缩
  • 1文件查找
    • 1.1 locate
    • 1.2 find
      • 1.2.1 指定搜索目录层级
      • 1.2.2对每个目录先处理目录内的文件,再处理目录本身
      • 1.2.3根据文件名和inode查找
      • 1.2.4 根据属主、属组查找
      • 1.2.5根据文件类型查找
      • 1.2.6空文件或目录
      • 1.2.7组合条件
      • 1.2.8 排除日录
      • 1.2.9根据文件大小来查找
      • 1.2.10根据时间戳
      • 1.2.11 根据权限查找
      • 1.2.12 处理动作
    • 1.3参数换xargs
  • 2压缩和解压缩
    • 2.1 compress和uncompress
    • 2.2 gzip和gunzip
    • 2.3 bzip2和bunzip2
    • 2.4 xz和unxz
    • 2.5 zip和unzip
  • 3打包和解包
    • 3.1tar
    • 3.2split
    • 3.3cpio

文件查找与打包压缩

1文件查找

在文件系统上查找符合条件的文件
文件查找: locate, find
非实时查找(数据库查找): locate
实时查找: find

1.1 locate

locate 查询系统上预建的文件索引数据库 /var/lib/mlocate/mlocate.db
索引的构建是在系统较为空闲时自动进行(周期性任务),执行updatedb可以更新数据库
索引构建过程需要遍历整个根文件系统,很消耗资源

工作特点:

  • ​ 查找速度快
  • ​ 模糊查找
  • ​ 非实时查找
  • ​ 搜索的是文件的全路径,不仅仅是文件名
  • ​ 可能只搜索用户具备读取和执行权限的目录

格式:


locate [OPTION]...[PATTERN].

常用选项

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

例:

locate -n 3 -r '\.sh$'	使用正则表达式找到前三个以.sh结尾的文件
/boot/grub2/i386-pc/modinfo.sh
/data/scripts/BMI_cal.sh
/data/scripts/CHOOK_RABBIT.sh

1.2 find

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

工作特点:

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

条式:

find [OPTION]... [查找路径] [查找条件] [处理动作]
  • 查找路径: 指定具体目标路径,默认为当前目录

  • 查找条件: 指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件

  • 处理动作: 对符合条件的文件做操作,默认输出至屏幕

1.2.1 指定搜索目录层级

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

例:

find /data -maxdepth 2	查找/data下的1级和2级目录(data本身不算1级)
/data
/data/.passwd.swp
/data/.passwd.swo
/data/.passwd.swn

1.2.2对每个目录先处理目录内的文件,再处理目录本身

-depth-d

例:

find /data
/data	目录
/data/.passwd.swp	文件
/data/.passwd.swo	文件
/data/.passwd.swn	文件

find /data -depth
/data/.passwd.swp	文件	
/data/.passwd.swo	文件
/data/scripts/BMI_cal.sh	目录
/data/scripts/work_menu.sh	目录
/data/scripts/show_sys_info.sh

1.2.3根据文件名和inode查找

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

例:

find /etc -name "*passwd*"	通配符,要加""
/etc/pam.d/passwd
/etc/security/opasswd
/etc/passwd-

#find / -inum 333 -ls	显示节点编号为333的文件与目录,-ls显示详细属性
      333      0 dr-xr-xr-x   9  root     root            0 Jul 25 15:11 /proc/98
      333      0 drwxr-xr-x   2  root     root            0 Jul 27 22:14 /sys/devices/system/memory/memory15/power

1.2.4 根据属主、属组查找

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

1.2.5根据文件类型查找

-type TYPE

TYPE可以是以下形式

f: 普通文件
d: 目录文件
l: 符号链接文件
s: 套接字文件
b: 块设备文件
c: 字符设备文件
p: 管道文件

例:

find /data -type d -ls
      128      0 drwxr-xr-x   3  root     root          225 Jul 26 12:37 /data
      138      0 drwxr-xr-x   2  root     root          212 Jul 27 17:07 /data/scripts

1.2.6空文件或目录

-empty

例:

find /etc -empty -ls

1.2.7组合条件

-a-o-not !

例:

#find /etc/ -type d -o -type l |wc -l
665
#find /etc/ -type d -o -type l -ls|wc -l	#此时相当于-type l 与-ls中间加了个-a,而-a优先级高于-o,只显示这两个之间的文件
260
#find /etc/ \( -type d -o -type l \) -ls|wc -l	可以加上\(\)解决
665

德·摩根定律

  • ​ (非A) 或 (非B) = 非(A且B)
  • ​ (非A) 且 (非B) = 非(A或B)

示例:

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

例:

#find ! -user joyce -a ! -user root
./mysql/mysql-community-client-8.0.32-1.el8.x86_64.rpm
./mysql/mysql-community-client-debuginfo-8.0.32-1.el8.x86_64.rpm
./mysql/mysql-community-client-plugins-8.0.32-1.el8.x86_64.rpm
等价于:
#find ! \( -user joyce -o -user root \)
./mysql/mysql-community-client-8.0.32-1.el8.x86_64.rpm
./mysql/mysql-community-client-debuginfo-8.0.32-1.el8.x86_64.rpm
./mysql/mysql-community-client-plugins-8.0.32-1.el8.x86_64.rpm

#find / \( -not -user root -a -not -name 'f*' \) -ls	查找属主不是root且名不是f开头的文件
#find / -not \( -user root -o  -name 'f*' \) -ls	等价

1.2.8 排除日录

-path	dir	 -a  -prune

例: 查找/下所有名字以.conf结尾的文件,但不查找/usr和/etc目录

#find /  \( -path '/usr' -o -path '/etc' \) -a -prune -o  -name "*.conf"
/boot/loader/entries/34f09f8df29847998143d560b2af24fb-4.18.0-348.el8.x86_64.conf
/boot/loader/entries/34f09f8df29847998143d560b2af24fb-0-rescue.conf
/run/NetworkManager/resolv.conf

1.2.9根据文件大小来查找

-size [+|-] #UNIT
	常用单位: k,M,G,c (byte) ,注意大小写敏感
#UNIT  (#-1,#]
	如	6k 表示(5k,6k]
-#UNIT [0,#-1]-6k 表示[0,5k]
+#UNIT (#,8)
	如	+6k 表示(6k,∞)

例:

#find / -size 10M 查找9M-10M的文件
/var/cache/dnf/epel-updateinfo.solvx
/usr/lib/firmware/qcom/sdm845/adsp.mbn
/usr/lib/modules/4.18.0-348.el8.x86_64/vmlinuz
/usr/share/fonts/google-noto-emoji/NotoColorEmoji.ttf

1.2.10根据时间戳

以“天”为单位

-atime[+|-]#	读时间
	#	[#,#+1)
	+#	[#+1,∞]
	-#	[O,#)
-mtime			修改时间
-ctime			属性修改时间

以“分钟”为单位

-amin
-mmin
-cmin

1.2.11 根据权限查找

-perm [/或-]MODE

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

说明:

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

例:

#find /data/ -perm -444 -ls| head -5	权限三个都得有读权限
      128      0 drwxr-xr-x   3  root     root          225 Jul 26 12:37 /data/
      132     12 -rw-r--r--   1  root     root        12288 Jul  7 20:41 /data/.passwd.swp
      136      4 -rw-r--r--   1  root     root         2640 Jul  8 16:58 /data/passwd
#find /data/ -perm /444 -ls| head -5	权限任意一个有4即可
      128      0 drwxr-xr-x   3  root     root          225 Jul 26 12:37 /data/
      132     12 -rw-r--r--   1  root     root        12288 Jul  7 20:41 /data/.passwd.swp
      135      4 --w-r--r--   1  root     root           51 Jul  8 10:46 /data/issue.bak
#find /data/ -perm /044 -ls| head -5	权限后两个任意一个有4即可
      128      0 drwxr-xr-x   3  root     root          225 Jul 26 12:37 /data/
      132     12 -rw-r--r--   1  root     root        12288 Jul  7 20:41 /data/.passwd.swp
      135      4 --w-r--r--   1  root     root           51 Jul  8 10:46 /data/issue.bak

[root@CentOS8 ~]#find /data/ -perm -002	查找other里带有写权限的,和下面等价
[root@CentOS8 ~]#find /data/ -perm /002

1.2.12 处理动作

-print	默认的处理动作,显示至屏幕,不加也默认执行了这个隐藏动作
-ls		类似于对查找到的文件执行“s -I"命令
-fls file		查找到的所有文件的长格式信息保存至指定文件中,相当于ls > file
-delete	删除查找到的文件,并不交互,慎用
-ok CMD {}\;	对查找到的每个文件执行由COMMAND指定的命令,对于每个文件执行命令之前,都会交与式要求用户确认
-exec CMD {}\;	对查找到的每个文件执行由COMMAND指定的命令
{}		用于引用查找到的文件名称自身

例:

#ls
f1.txt  f2.txt  f3.txt  issue.bak  
#find /data/ -name 'f*' -ok  rm {} \;	find查找/data/下以f开头的文件并删除,{}代表前面find找到的文件,-ok开始标志\;表示结束标志
< rm ... /data/f1.txt > ? y
< rm ... /data/f2.txt > ? y		使用-exec不适应-ok,则不交互直接执行 
< rm ... /data/f3.txt > ?
#ls
f3.txt  issue.bak

1.3参数换xargs

xargs CMD 参数

例:

#find -name '*.txt'|xargs ls -Sl	将当前目录下找到的*.txt文件传递给ls作为参数以排序。(注意:ls不支持标准输入,无法使用管道传输 )
-rw-r--r--  1 root root 15 Jul 28 00:19 ./f1.txt
-rw-r--r--  1 root root 15 Jul 26 12:37 ./nianling.txt
-rw-r--r--. 1 root root 12 Jul 23 20:34 ./f3.txt
-rw-r--r--  1 root root  0 Jul 28 00:19 ./f2.txt

#echo {1..10}
1 2 3 4 5 6 7 8 9 10
#echo {1..10}|xargs -n1
1
2
3
4
5
6
7
8
9
10
#echo {1..10}|xargs -n4
1 2 3 4
5 6 7 8
9 10


#seq 10
1
2
3
4
5
6
7
8
9
10
#seq 10|xargs
1 2 3 4 5 6 7 8 9 10

#echo user{1..5}|xargs -n1 useradd	批量创建账号,注意使用-n1将参数分成一行一行,因为useradd一次只能接受一个参数
#echo user{1..5}|xargs -n1 userdel -r	批量删除账号

当文件名为"a b" 或 "c d"时,xargs默认以空格 作为文件名分隔符,此时会出现找不到文件a文件b文件c文件d的问题
#find -print0 | xargs -0 rm 使用0(nul)作为分隔符,这样rm时不会出现问题

2压缩和解压缩

2.1 compress和uncompress

这两个工具来源于ncompress包,需要事先yum

格式

compress options [file ...]
uncompress file.Z 			解压缩

常用选项

-d	解压缩,相当于uncompress
-c	结果输出至标准输出,不删除原文件
-v	显示详情

例:

#compress -c file.txt > f.txt.Z  压缩file.txt至f.txt.Z,但保留原文件
#compress -dc f.txt.Z > f2.txt   解压缩f.txt.Z到f2.txt

zcat file.z 不显式解压缩的前提下查看文本文件内容,也可以重定向到文件中,即解压缩

2.2 gzip和gunzip

格式:

gzip [OPTION]... FILE
gunzip	FILE

常用选项:

-k 	keep,保留原文件,C8上才有
-d	解压缩,相当于gunzip
-c	结果输出至标准输出,保留原文件不改变
-#	指定压缩比,#取值为1-9,值越大压缩比越大

例:

#cat f4 | gzip > f4.gz	支持管道

2.3 bzip2和bunzip2

来自于bzip2包

格式:

bzip2 [OPTION]... FILE...
bunzip2	FILE

常用选项

-k	keep,保留原文件
-d	解压缩
-c	结果输出至标准输出,保留原文件不改变
-#  压缩比,取值1-9,默认为9

也可以预览,不过使用bzcat file,而不是zcat

2.4 xz和unxz

来自于xz包

格式:

xz [OPTION]... FILE...
unxz	FILE

常用选项

-k	keep,保留原文件
-d	解压缩
-c	结果输出至标准输出,保留原文件不改变
-#  压缩比,取值1-9,默认为6

也可以预览,不过使用xzcat file,而不是zcat或bxzcat

2.5 zip和unzip

zip 可以实现打包目录和多个文件并压缩成一个文件,但可能会丢失文件属性信息,如所有者和组信息,一般建议使用 tar 代替

zip [OPTION]... FILE_back_up  FILE
unzip	默认解包结果输出到屏幕显示,可以使用-p重定向到文件

选项:

-r	对目录进行打包
-d	dir	将文件解包到dir下
-p	管道

默认打包会包括目录本身,如果只想打包其中的文件,需要先进入目录中再进行打包

例:

#cat /var/log/messages | zip message -	(-表示接收前面的标准输出)
  adding: - (deflated 86%)
#ls
message.zip

总结:

  • 压缩比:xz > bz2 > gz > zip > compress
  • zip可以压缩目录,其他都只能压缩文件,且单个文件压缩成单个文件

3打包和解包

3.1tar

tar 即 Tape ARchive磁带归档,可以对目录和多个文件打包成一个,且可以压缩,并且保留文件属性不丢失,常用于备份,推荐使用

格式

tar [OPTION]...	FILE_backup FILE
c	打包 
t	预览 
x	解包 ,不需要加zjJ,通用,但系统上必须事先有安装其他命令
v	显示详细信息,过程
f	后跟要处理的文件
p	保留权限,不加也可以保留
-C	解压到指定位置
z	压缩成gz格式,间接调用gz命令,系统上必须事先有安装
j	压缩成bz2格式,同理
J	压缩成xz格式,同理
--exclude=FILE	排除文件
-T FILE	指定要打包的文件	
-x FILE	指定要排除的文件

注意:tar无法备份ACL权限的文件

默认打包会包括目录本身,如果只想打包其中的文件,需要先进入目录中再进行打包

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

(2) 追加文件至归档: 注: 不支持对压缩文件追加
tar -rf /PATH/FILE.tar FILE...

(3)查看归档文件中的文件列表
tar -t -f /PATH/FILE.tar

(4展开文档
tar xf /PATH/FILE.tar
tar xf /PATH/FILE.tar -C /PATH

(5) 结合压缩工具实现: 归档并压缩
z	压缩成gz格式,间接调用gz命令,系统上必须事先有安装
j	压缩成bz2格式,同理
J	压缩成xz格式,同理

例:

#tar c /var | tar x -C /data/	相当于cp,将/var目录复制到/data/下,但速度更快

3.2split

split命令可以分割一个文件为多个

-b	指定分割大小
-d	指定文件后缀为数字,00 01 ...

例:

#split -b 1K shopping-table.sql /data/shopping-table
#ll /data -h
-rw-r--r--  1 root root 1.0K Jul 28 14:41 shopping-tableaa
-rw-r--r--  1 root root 1.0K Jul 28 14:41 shopping-tableab
-rw-r--r--  1 root root 1.0K Jul 28 14:41 shopping-tableac
-rw-r--r--  1 root root 1.0K Jul 28 14:41 shopping-tablead
-rw-r--r--  1 root root 1.0K Jul 28 14:41 shopping-tableae
-rw-r--r--  1 root root 1.0K Jul 28 14:41 shopping-tableaf
-rw-r--r--  1 root root 1.0K Jul 28 14:41 shopping-tableag
-rw-r--r--  1 root root 1.0K Jul 28 14:41 shopping-tableah
-rw-r--r--  1 root root 1002 Jul 28 14:41 shopping-tableai

#cat	/data/shopping-table00* > /data	合并为一个

3.3cpio

  • cpio 是历史悠久的打包和解包工具,不过目前也已较少使用

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

格式:

cpio [选项] > 文件名或者设备名
cpio [选项] < 文件名或者设备名

常用选项:

-o	output模式,打包,对内存的数据输出到文件中,将标准输入传入的文件名打包后发送到标准输出
-i	input模式,解包,对磁盘里文件输入到内存,标准输入传入的打包文件名解包到当前目录
-t	预览,查看标准输入传入的打包文件中包含的文件列表
-o filename 输出到指定的归档文件名
-A	向已存在的归档文件中追加文件
-I filename 对指定的归档文件名解压
-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

你可能感兴趣的:(Linux,linux)