文件查找与压缩
• 在文件系统上查找符合条件的文件
• 文件查找:locate, find
非实时查找(数据库查找):locate
实时查找:find
通常 find 不很常用因为速度慢之外, 还要读取磁盘,一般先使用 whereis或者是locate来检查,如 果找不到,一般才find命令来搜寻
whereis只找系统中某些特定目录下 面的文件,locate是利用数据库来搜寻文件名,两者就相当的快速,并且没有实 际的搜寻硬盘内的文件系统状态。
[root@centos6 app ]#whereis rm
rm: /bin/rm /usr/share/man/man1p/rm.1p.gz /usr/share/man/man1/rm.1.gz一、文件查找
1、locate
• 查询系统上预建的文件索引数据库
/var/lib/mlocate/mlocate.db
• 依赖于事先构建的索引
索引的构建是在系统较为空闲时自动进行(周期性任务),管理员手动更新数据库(updatedb)
• 索引构建过程需要遍历整个根文件系统,极消耗资源
• 工作特点:
• 查找速度快
• 模糊查找
• 非实时查找 (更新数据库:updatedb即可实时查找)
• 搜索的是文件的全路径,不仅仅是文件名
• 可能只搜索用户具备读取和执行权限的目录
• locate KEYWORD
• 有用的选项
– -i 不区分大小写的搜索 locate -i new.txt
– -n N 只列举前N个匹配项目 locate -n 3 profile
– -r 使用正则表达式
• 示例
• 搜索名称或路径中带有“conf”的文件locate conf
• 使用Regex来搜索以“.conf”结尾的文件locate -r ‘\.conf$’
whatis 也是基于数据库
[root@centos6 app ]#whatis ls
ls (1) - list directory contents
ls (1p) - list directory contents[root@centos6 app ]#locate -l 4 shadow
/etc/gshadow
/etc/gshadow-
/etc/shadow
/etc/shadow-
2、find
• 实时查找工具,通过遍历指定路径完成文件查找
• 工作特点:
• 查找速度略慢
• 精确查找
• 实时查找
• 可能只搜索用户具备读取和执行权限的目录
• 语法:
• find [OPTION]... [查找路径] [查找条件][处理动作]
查找路径:指定具体目标路径;默认为当前目录
查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件
处理动作:对符合条件的文件做操作,默认输出至屏幕
查找条件
指搜索层级
-maxdepth level 最大搜索目录深度,指定目录为第1级
-mindepthlevel 最小搜索目录深度
• 根据文件名和inode查找:
-name"文件名称":支持使用glob(通配符)
*,?, [], [^]
-iname"文件名称":不区分字母大小写
-inumn 按inode号查找 find / -inum 2 -ls
-samefilename 相同inode号的文件即:硬链接ln **
-linksn 链接数为n的文件
-regextypeposix-extended -regex "PATTERN":以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称
____________________________________________________________________________
如 find 默认以当前路径查找
find /etc -maxdepth 3 -mindepth 2 -name “network”
find -name “*.txt” *代表通配符。双引号不可少。特殊符号的不加双引号可能报错
[root@centos7 app ]#find /etc -name network*
find /root -regex "\.txt$"
find /etc/ -name "*.conf"2> find.error > find.right
[root@centos6 app ]#find /app -regextypeposix-extended -regex '/app/.(r..t)...\1er'
/app/aroot456rooter
[root@centos6 app ]#find -regextype posix-extended -regex './.(r..t)...\1er'
./aroot456rooter
• 根据属主、属组查找:
-userUSERNAME:查找属主为指定用户(UID)的文件
-groupGRPNAME: 查找属组为指定组(GID)的文件
-uidUserID:查找属主为指定的UID号的文件
-gidGroupID:查找属组为指定的GID号的文件
-nouser:查找没有属主的文件
-nogroup:查找没有属组的文件
__________________________________________________________________
find/home -user dhy -name “*.sh” 通配符,也可以用正则表达式
[root@centos7app ]#su hehe ;touch f1 ;exit; userdel -r hehe ;
find -nouser 结果为f1
• 根据文件类型查找:
-type TYPE:
• f: 普通文件
• d: 目录文件
• l: 符号链接文件
• s:套接字文件
• b: 块设备文件 存储数据
• c: 字符设备文件 输出设备,如tty
• p: 管道文件
————————————————————————————
find/run -type s -ls 搜索套接字文件,-ls类似ls命令
find-type d 默认搜索当前目录下的目录
• 组合条件:
与:-a
或:-o
非:-not, !
————————————————————————————
find/home -user wang -name "*.sh" 默认为并且的关系(-a) 搜索User为wang的文件且文件名为.sh的文件
find /home -user wang ! -name “*.sh” 是wang的文件,但不以.sh结尾
find /home ! \( -user wang -o -name “*.sh” \) 不是wang也不是.sh结尾的文件
• 德·摩根定律:
(非 A) 或 (非 B) = 非(A 且 B)
(非 A) 且 (非 B) = 非(A 或 B)
• 示例:
!A-a !B = !(A -o B)
!A-o !B = !(A -a B)
• find -namesnow.png
• find -inamesnow.png
• find /-name “*.txt”
• find /var –name “*log*”
• find -user joe-group joe
• find -user joe-not -group joe
• find -user joe-o -user jane
• find -not \(-user joe -o -user jane \) 不是joe也不是jane的
• 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”
prune是剪切的意思,此处表示排除,-a是且的关系
查找/etc/下,除/etc/sane.d和/etc/fonts两个目录的其它所有.conf后缀的文件
注意( f )小括号必须与字符间有空格,否则报错
查找条件
• 根据文件大小来查找:
-size[+|-]#UNIT
常用单位:k, M, G,c(byte)
#UNIT:(#-1, #]
如:6k 表示(5k,6k]
-#UNIT:[0,#-1]
如:-6k 表示[0,5k]
+#UNIT:(#,∞)
如:+6k 表示(6k,∞)
————————————————————————————
dd if =/dev/zero of =f1 bs=1 count=1024
find-size 2k 表示1k到2k 不包含1k
find-size 2048c 表示2047字节到2048字节
find / -size +50M -size-101M 表示查找50M到100M 不包含50M
查找条件
• 根据时间戳:
以“天”为单位;
-atime[+|-]#,
#:[#,#+1)
+#:[#+1,∞]
-#:[0,#) 过去一周内 -7
-mtime
-ctime
以“分钟”为单位:
-amin
-mmin
-cmin
——————————————————————————
[root@study ~]# find [PATH] [option] [action] 选项与参数:
1\. 与时间有关的选项:共有 -atime, -ctime 与 -mtime ,以 -mtime 说明
-mtime n :n 为数字,意义为在 n 天之前的“一天之内”被更动过内容的文件;
-mtime +n :列出在 n 天之前(不含 n 天本身)被更动过内容的文件文件名;
-mtime -n :列出在 n 天之内(含 n 天本身)被更动过内容的文件文件名。
-newer file :file 为一个存在的文件,列出比 file 还要新的文件文件名
范例一:将过去系统上面 24 小时内有更动过内容 (mtime) 的文件列出
[root@study ~]# find / -mtime 0
# 那个 0 是重点!0 代表目前的时间,所以,从现在开始到 24 小时前,
# 有变动过内容的文件都会被列出来!那如果是三天前的 24 小时内?
# find / -mtime 3 有变动过的文件都被列出的意思!
范例二:寻找 /etc 下面的文件,如果文件日期比 /etc/passwd 新就列出
[root@study ~]# find /etc -newer /etc/passwd
# -newer 用在分辨两个文件之间的新旧关系是很有用的!
时间参数真是挺有意思的!我们现在知道 atime, ctime 与 mtime 的意义,如果你想要找出一 天内被更动过的文件名称, 可以使用上述范例一的作法。但如果我想要找出“4天内被更动过 的文件文件名”呢?那可以使用“ find /var -mtime -4 ”。那如果是“4天前的那一天”就用“ find /var -mtime 4 ”。有没有加上“+, -”差别很大喔!我们可以用简单的图示来说明一下:
图6.5.1、find 相关的时间参数意义
图中最右边为目前的时间,越往左边则代表越早之前的时间轴啦。由图 6.5.1 我们可以清楚的 知道:
+4代表大于等于5天前的文件名:ex> find /var -mtime +4
-4代表小于等于4天内的文件文件名:ex> find /var -mtime -4
4则是代表4-5那一天的文件文件名:ex> find /var -mtime 4—————————上述find查找时间来自鸟哥的linux私房菜第4版第331页——
• 根据权限查找:
-perm[/|-]MODE
MODE:精确权限匹配
/MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可,或关系,+ 从centos7开始淘汰
-MODE:每一类对象都必须同时拥有指定权限,与关系
0表示不关注
• find -perm 755 会匹配权限模式恰好是755的文件
• 只要当任意人有写权限时,find-perm +222就会匹配
• 只有当每个人都有写权限时,find-perm -222才会匹配
• 只有当其它人(other)有写权限时,find -perm -002才会匹配
———————————————————————————
find-perm /600 600是或的关系。600中的6可以是r,rw,w,也是或关系。即r,rw,w三种满足一个即可
find-perm -600 600 3位是且的关系,6必须是rw,也是且
处理动作
• -print:默认的处理动作,显示至屏幕
• -ls:类似于对查找到的文件执行“ls-l”命令
• -delete:删除查找到的文件
• -fls file:查找到的所有文件的长格式信息保存至指定文件中
• -ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令,对于每个文件执行命令之前,都会交互式要求用户确认
• -exec COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令
• {}: 用于引用查找到的文件名称自身
• find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令
二、 参数替换xargs
• 由于很多命令不支持管道|来传递参数,而日常工作中有这个必要,所以就有了xargs命令
• xargs用于产生某个命令的参数,xargs可以读入 stdin 的数据,并且以空格符或回车符将 stdin 的数据分隔成为arguments
• 注意:文件名或者是其他意义的名词内含有空格符的情况
• 有些命令不能接受过多参数,命令执行可能会失败,xargs可以解决
• 示例:
ls f* |xargs rm
find /sbin -perm +700 |ls -l 这个命令是错误的
find /sbin -perm +7000 | xargs ls –l
• find和xargs格式:find | xargs COMMAND
___________________________________________________________________
find -exec rm {} \ 是一个一个删除,比较慢,ls * | xargs rm 较快
find示例
• find -name“*.conf” -exec cp{} {}.orig \; 备份配置文件,添加.orig这个扩展名
• find /tmp -ctime+3 -user joe -ok rm {} \; 提示删除存在时间超过3天以上的joe的临时文件
• find ~ -perm-002 -exec chmod o-w {} \; 在你的主目录中寻找可被其它用户写入的文件
• find /data –type f -perm 644-name “*.sh” –exec chmod 755 {} \; 把/data目录下以.sh结尾的普通文件且权限是644的文件。替换为权限为755
• find /home–type d -ls
如下示例:在整个文件系统中,找出所有归属于dhy用户的文件并复制到/root/findresults目录
1、查找/var目录下属主为root,且属组为mail的所有文件
find /var/ -user root -group mail
2、查找/var目录下不属于root、lp、gdm的所有文件
find /var -not \( -user root -o -user lp -o -user gdm \)
3、查找/var目录下最近一周内其内容修改过,同时属主不为root,也不是postfix的文件
find /var -mtime -7 -not \( -user root -o -user postfix \)
三、打包压缩
• file-roller
• compress/uncompress: .Z
• gzip/gunzip: .gz
• bzip2/bunzip2: .bz2
• xz/unxz: .xz
• zip/unzip
• tar
• cpio
1、 compress/uncompress
• compress [-dfvcVr] [-bmaxbits] [file ...]
-d: 解压缩,相当于uncompress 默认只识别.Z
-c: 结果输出至标准输出,不删除原文件
-v: 显示详情
• uncompress 解压缩
• zcat file.Z >file
_________________________________________________
compress -c passwd > f1.X f1.X和passwd权限不一样,>是新建文件
compress 压缩后源文件丢失
type 查看压缩比
2、gzip/gunzip
• gzip [OPTION]... FILE ...
-d: 解压缩,相当于gunzip 只识别.gz结尾的文件
-c: 将压缩或解压缩的结果输出至标准输出,不删除原文件
-#:1-9,指定压缩比,值越大压缩比越大 默认是6
• zcat:不显式解压缩的前提下查看文本文件内容
• 实例:
gzip -c messages >messages.gz >丢失权限,默认权限有umask计算
gzip -c -d messages.gz > messages
zcat messages.gz > messages
——————————————————————————
gzip压缩后源文件丢失,只有压缩包
3、bzip2/bunzip2/bzcat
• bzip2 [OPTION]... FILE ...
-k: keep, 保留原文件
-d:解压缩 识别bzip2结尾或者其它结尾的文件(加.out)
-#:1-9,压缩比,默认为9
• bzcat:不显式解压缩的前提下查看文本文件内容或者-c
-v 显示详细信息
4、xz/unxz/xzcat
• xz [OPTION]... FILE ...
-k: keep, 保留原文件
-d:解压缩
-#:1-9,压缩比,默认为6
• xzcat: 不显式解压缩的前提下查看文本文件内容
5、zip/unzip
• 打包压缩
zip –r/testdir/sysconfig /etc/sysconfig/
• 解包解压缩
unzip sysconfig.zip
cat /var/log/messages | zip messages -
unzip -p message > message
四、tar工具
tar打包,需配合上述压缩工具
• Tar(TapeARchive,磁带归档的缩写)
• tar [OPTION]...
(1) 创建归档
tar -c -f /PATH/TO/SOMEFILE.tar FILE... -c创建文件,若有-f选项,后面必须跟文件
(2) 追加文件至归档: 注:不支持对压缩文件追加
tar -r -f /PATH/TO/SOMEFILE.tar FILE... -r递归
(3) 查看归档文件中的文件列表
tar -t -f /PATH/TO/SOMEFILE.tar -t查看
(4) 展开归档
tar -x -f /PATH/TO/SOMEFILE.tar -x 展开包
tar -x -f /PATH/TO/SOMEFILE.tar -C /PATH/ -C展开包到指定路径/PATH/
(5) 结合压缩工具实现:归档并压缩
-j: bzip2, -z: gzip,-J: xz 下面tar打包,再加上压缩功能
——————————————————————
tar -zcvf etc.bak /etc -C /tmp
-z表示gzip压缩方式,v显示打包压缩具体详细过程。打包压缩的文件见名知意,etc.bak.z较好
tar工具
• -T选项指定输入文件,-X选项指定包含要排除的文件列表
tar zcvf mybackup.tgz -T /root/includefilelist -X/root/excludefilelist
• 分割大的tar 文件为多份小文件:
split –b Size –d tar-file-name prefix-name
split -b 1M –d mybackup.tgz mybackup-parts 把打包压缩的包mybackup,tgz分成mybackup-parts为前缀的多个包名
split -b 1M mybackup.tgz mybackup-parts
split -b size 要拆分的包 拆分包名前缀
• 合并:
拆分的包,要合并才能查看
cat mybackup-parts* > mybackup.tar.gz
————————————————————————————————
五、cpio
• 功能:复制文件从或到归档
• cpio命令是通过重定向的方式将文件进行打包备份,还原恢复的工具,它可以解压以“.cpio”或 者“.tar”结尾的文件
• cpio [选项] > 文件名或者设备名
• cpio [选项] < 文件名或者设备名
• 选项
-o 将文件拷贝打包成文件或者将文件输出到设备上
-i 解包,将打包文件解压或将设备上的备份还原到系统
-t 预览,查看文件内容或者输出到设备上的文件内容
-v 显示打包过程中的文件名称。
-d 解包生成目录,在cpio还原时,自动的建立目录
-c 一种较新的存储方式
示例
• 将etc目录备份:
find ./etc -print |cpio -ov >etc.cpio
• 内容预览
cpio –tv < etc.cpio
• 解包文件
cpio –idv < etc.cpio