Linux文件查找(locate & find)
locate
查询系统上预建的文件索引数据库(速度快,但更新不实时)
/var/lib/mlocate/mlocate.db
依赖于事先构建的索引
索引的构建是在系统较为空闲时自动进行(周期性任务), 管理员手动更新数据库(updatedb,实际生产环境中不建议使用)
索引构建过程需要遍历整个根文件系统,极消耗资源
工作特点:
查找速度快
模糊查找
非实时查找
搜索的是文件的全路径,不仅仅是文件名
可能只搜索用户具备读取和执行权限的目录
用法
locate KEYWORD
选项
• -i 执行区分大小写的搜索
• -n N 只列举前N个匹配项目
locate foo
• 搜索名称或路径中带有“ foo”的文件
locate -r ‘\.foo$’
• 使用Regex来搜索以“ .foo”结尾的文件
find ( 精确查找,支持匹配符;只搜索磁盘文件(如proc不搜);默认自带递归)
实时查找工具,通过遍历指定路径完成文件查找;
工作特点:
• 查找速度略慢
• 精确查找
• 实时查找
• 可能只搜索用户具备读取和执行权限的目录
语法:
find [OPTION]… [查找路径] [查找条件] [处理动作]
查找路径:指定具体目标路径;默认为当前目录
查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件
处理动作:对符合条件的文件做操作,默认输出至屏幕(如 -ls )
根据文件名和inode查找:
-name "文件名称":支持使用glob
*, ?, [], [^]
-iname "文件名称":不区分字母大小写
-inum n 按inode号查找
-samefile name 相同inode号的文件
-links n 链接数为n的文件
-regex "PATTERN":以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称
根据属主、属组查找:(仅根据UID号 GID号进行搜索,并不会根据用户名和组名进行搜索)
-user USERNAME:查找属主为指定用户(UID)的文件
-group GRPNAME: 查找属组为指定组(GID)的文件
-uid UserID:查找属主为指定的UID号的文件
-gid GroupID:查找属组为指定的GID号的文件
-nouser:查找没有属主的文件
-nogroup:查找没有属组的文件
根据文件类型查找:
-type TYPE:
f: 普通文件
d: 目录文件
l: 符号链接文件
s:套接字文件
b: 块设备文件
c: 字符设备文件
p: 管道文件
组合条件:(与 -a 的优先级比 或 -o 的优先级要高 ; 如果命令中有先计算或 -o然后再计算与-a的,要加括号 ; ( -o ) -a ) )
与: -a
或: -o
非: -not, !
德·摩根定律:
(非 P) 或 (非 Q) = 非(P 且 Q)
(非 P) 且 (非 Q) = 非(P 或 Q)
示例:
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
例子
find -name snow.png
• 搜索名为snow.png的文件
find -iname snow.png
• 不分大小写地搜索名为snow.png、 Snow.png、SNOW.PNG等等的文件
find / -name “*.txt”
find /var –name “*log*”
find -user joe -group joe
搜索被用户joe 以及组群joe所拥有的文件
find -user joe -not -group joe
find -user joe -o -user jane
find -not \( -user joe -o -user 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” -print
根据文件大小来查找:
-size [+|-]#UNIT //-size 10k 只是搜索大小为(9-10]K的文件
常用单位: k, M, G
#UNIT: (#-1, #]
如: 6k 表示(5k,6k]
-#UNIT: [0,#-1]
如: -6k 表示[0,5k]
+#UNIT: (#,∞)
如: +6k 表示(6k,∞)
根据时间戳:(正数为未来时间,修改时间;负数为过去时间)
以“天”为单位;
-atime [+|-]#,
#: [#,#+1) // -atime 7 : [7,8)
+#: [#+1,∞] //atime +7 : [8,∞]
-#: [0,#) //atime -7 : [0,7)
-mtime
-ctime
以“分钟”为单位:
-amin
-mmin
-cmin
根据权限查找:
-perm [/|-]MODE
MODE: 精确权限匹配(权限前不带任何符号,即为精确匹配)
/MODE:任何一类(u,g,o)对象的权限中只要能一位匹配
即可,或关系, + : centos7之前的版本用 ; centos7开始用 /
–MODE:每一类对象都必须同时拥有指定权限,与关系
0 表示不关注(什么权限都可以,凑数)
find -perm 755 会匹配权限模式恰好是755的文件
只要当任意人有写权限时, find -perm +222就会匹配
只有当每个人都有写权限时, find -perm -222才会匹配
只有当其它人( other)有写权限时, find -perm -002才会匹配
处理动作:
-print:默认的处理动作,显示至屏幕;
-ls:类似于对查找到的文件执行“ ls -l”命令
-delete:删除查找到的文件;
-fls file:查找到的所有文件的长格式信息保存至指定文件中
-ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令;对于每个文件执行命令之前,都会交互式要求用户确认
-exec COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令;(直接执行,不会要求用户确认)
{}: 用于引用查找到的文件名称自身
find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令
有些命令不能接受过多参数,此时命令执行可能会失败,下面方式可规避此问题
find | xargs COMMAND
-0 换行
-rm 删除
软件包管理
软件运行环境
API: Application Programming Interface
POSIX: Portable OS
程序源代码 –> 预处理 –> 编译 –> 汇编 –> 链接
静态编译:
共享编译: .so
ABI: Application Binary Interface
Windows与Linux不兼容
ELF(Executable and Linkable Format)
PE( Portable Executable)
库级别的虚拟化:
Linux: WINE
Windows: Cywin
C程序编译过程
Java程序运行
开发语言
系统级开发
C
C++
应用级开发
java
delphi
Python
go
php
perl
ruby
包管理器
二进制应用程序的组成部分:
二进制文件、库文件、配置文件、帮助文件
程序包管理器:
debian: deb文件, dpkg包管理器
redhat: rpm文件, rpm包管理器
rpm: Redhat Package Manager
RPM Package Manager
包命名
源代码: name-VERSION.tar.gz|bz2|xz
VERSION: major.minor.release
rpm包命名方式:
name-VERSION-release.arch.rpm
例: bash-4.2.46-19.el7.x86_64.rpm
VERSION: major.minor.release
release: release.OS
常见的arch:
x86: i386, i486, i586, i686
x86_64: x64, x86_64, amd64
powerpc: ppc
跟平台无关: noarch
包命名和工具
包:分类和拆包
Application-VERSION-ARCH.rpm: 主包
Application-devel-VERSION-ARCH.rpm 开发子包
Application-utils-VERSION-ARHC.rpm 其它子包
Application-libs-VERSION-ARHC.rpm 其它子包
包之间:可能存在依赖关系,甚至循环依赖解决依赖包管理工具:
yum: rpm包管理器的前端工具
apt-get: deb包管理器前端工具
zypper: suse上的rpm前端管理工具
dnf: Fedora 18+ rpm包管理器前端管理工具
库文件
查看二进制程序所依赖的库文件:
ldd /PATH/TO/BINARY_FILE
管理及查看本机装载的库文件:
ldconfig
/sbin/ldconfig -p: 显示本机已经缓存的所有可用库文件
名及文件路径映射关系
配置文件: /etc/ld.so.conf, /etc/ld.so.conf.d/*.conf
缓存文件: /etc/ld.so.cache
包管理器
程序包管理器:
功能:将编译好的应用程序的各组成文件打包一个或几个程序包文件,从而方便快捷地实现程序包的安装、卸载、查询、升级和校验等管理操作
1、包文件组成 (每个包独有)
RPM包内的文件
RPM的元数据,如名称,版本,依赖性,描述等
安装或卸载时运行的脚本
2、数据库(公共)
程序包名称及版本
依赖关系
功能说明
包安装后生成的各文件路径及校验码信息
程序包的来源
管理程序包的方式:
使用包管理器: rpm
使用前端工具: yum, dnf
获取程序包的途径:
(1) 系统发版的光盘或官方的服务器;
CentOS镜像:
https://www.centos.org/download/
(2) 项目官方站点
程序包的来源
(3) 第三方组织:
Fedora-EPEL:
Extra Packages for Enterprise Linux
Rpmforge:RHEL推荐,包很全
搜索引擎:
(4) 自己制作
注意:检查其合法性: 来源合法性,程序包的完整性
rpm包管理
CentOS系统上使用rpm命令管理程序包:
安装、卸载、升级、查询、校验、数据库维护
安装:
rpm {-i|–install} [install-options] PACKAGE_FILE…
-v: verbose
-vv:
-h: 以#显示程序包管理执行进度
rpm -ivh PACKAGE_FILE …
rpm包安装
[install-options]
–test: 测试安装,但不真正执行安装; dry run模式
–nodeps:忽略依赖关系
–replacepkgs | replacefiles
–nosignature: 不检查来源合法性
–nodigest:不检查包完整性
–noscipts:不执行程序包脚本片断
%pre: 安装前脚本; –nopre
%post: 安装后脚本; –nopost
%preun: 卸载前脚本; –nopreun
%postun: 卸载后脚本; –nopostun
rpm包升级
升级:
rpm {-U|–upgrade} [install-options] PACKAGE_FILE…
rpm {-F|–freshen} [install-options] PACKAGE_FILE…
upgrade:安装有旧版程序包,则“升级”
如果不存在旧版程序包,则“安装”
freshen:安装有旧版程序包,则“升级”
如果不存在旧版程序包,则不执行升级操作
rpm -Uvh PACKAGE_FILE …
rpm -Fvh PACKAGE_FILE …
–oldpackage:降级
–force: 强行升级
升级注意项
注意:
(1) 不要对内核做升级操作; Linux支持多内核版本并存,因此 ,对直接安装新版本内核
(2) 如果原程序包的配置文件安装后曾被修改,升级时,新版本的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留
1、写个脚本:
*
***
******
********
================================================
#!/bin/bash # read -p "Do you want to see how many floors ? " y r=1 l=1 o="\033[42m \033[0m" p="\033[42m*\033[0m" if echo $y | egrep -q "^[[:digit:]]+$";then #判断用户输入的是否为纯数字 while [[ $r -le $y ]];do #判读打印的行是否大于用户要求的行 while [[ $l -le $[$[$y*2]-1] ]];do #固定行,根据光标所在的列有要求的打印空格或者* if [[ $l -le $[$y-$r] ]];then echo -ne $o elif [[ $l -ge $[$[$[2*$r]+$y]-$r] ]] ;then echo -ne $o else echo -ne $p fi let l++ done echo let r++ l=1 done else echo "please try again" fi
2、用until循环实现国际象棋棋盘
#!/bin/bash # r="\033[41m \033[0m" u="\033[42m \033[0m" l=1 h=1 until [[ $l -gt 8 ]];do until [[ $h -gt 8 ]];do [[ $[$h+$l]%2 -eq 0 ]] && echo -en $r || echo -en $u let h++ done echo h=1 let l++ done
原创文章,作者:hunter,如若转载,请注明出处:http://www.178linux.com/36368
评论列表(1条)
文章对一些概念的东西进行了罗列,也不解释这是什么,是用来做什么的,就跟笔记一样,望以后能该进。