文件查找与打包压缩
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 [选项] < 文件名或者设备名
常用选项:文章来源:https://www.toymoban.com/news/detail-691307.html
-o output模式,打包,对内存的数据输出到文件中,将标准输入传入的文件名打包后发送到标准输出
-i input模式,解包,对磁盘里文件输入到内存,标准输入传入的打包文件名解包到当前目录
-t 预览,查看标准输入传入的打包文件中包含的文件列表
-o filename 输出到指定的归档文件名
-A 向已存在的归档文件中追加文件
-I filename 对指定的归档文件名解压
-F filename 使用指定的文件名替代标准输入或输出
-d 解包生成目录,在cpio还原时,自动建立目录
-v 显示打包过程中的文件名称
例:文章来源地址https://www.toymoban.com/news/detail-691307.html
#将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_6_文件查找与打包压缩的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!