LINUX企业运维 April 06, 2020

十九、shell脚本及find文件查找基本用法

Words count 5.8k Reading time 5 mins. Read count 0

bash 如何展开命令行

  把命令行分成单个命令词

  展开别名

  展开大括号的声明({})

  展开波浪符声明(~)

  命令替换$()和 ``

  再次把命令行分成命令词

  展开文件通配(*、?、[abc]等等)

  准备I/0重导向(<、>)

  运行命令

文件查找

  在文件系统上查找符合条件的文件

  文件查找:locate,find

    非实时查找(数据库查找):locate

    实时查找:find

locate命令

  查询系统上预建的文件索引数据库

    /var/lib/mlocate/mlocate.db

  依赖于事先构建的索引

    索引的构建是在系统较为仝闲时自动进行(周期性任务),管理员手动更新数据库(updatedb)

  索引构建过程需要遍历整个根文件系统,极消耗资源

  工作特点:

    ·查找速度快

    ·模糊查找

    ·非实时查找

    ·搜索的是文件的全路径,不仅仅是文件名

    ·可能只搜索用户具备读取和执行权限的目录

  locate KEYWORD

  有用的选项

  -i不区分大小写的搜索

  -n N只列举前N个匹配项目

  -r使用正则表达式
  示例

  搜索名称或路径中带有”conf”的文件

    locate conf

  使用Regex来搜索以”.conf”结尾的文件

    locate '\.conf$’

find命令

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

  工作特点:

  查找速度略慢

  精确查找

  实时查找

  可能只搜索用户具备读取和执行权限的目录

  语法:

  find[OPTION]...[查找路径][查找条件][处理动作]

    查找路径:指定具体目标路径;默认为当前目录

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

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

查找条件

  指搜索层级

    -maxdepth level最大搜索目录深度,指定目录为第1级

    -mindepth level最小搜索目录深度

  根据文件名和inode查找:

    -name”文件名称”:支持使用glob

    -iname”文件名称”:不区分字母大小写

    -inum n按inode号查找

    -samefile name相同inode号的文件

    -links n链接数为n的文件

    -regex”PATTERN”:以PATTERN匹配整个文件路径字符串, 而不仅仅是文件名称

  根据属主、属组查找:

    -user USERNAME:查找属主为指定用户(UID)的文件

    -group GRPNAME:查找属组为指定组(GID)的文件

    -uid UserID:查找属主为指定的UID号的文件

    -gid GroupID:查找属组为指定的GID号的文件

    -nouser:查找没有属主的文件

    -nogroup:查找没有属组的文件

根据文件类型查找:

  -type TYPE.
    ·f:普通文件

    ·d:目录文件

    ·l:符号链接文件

    ·s:套接字文件

    ·b:块设备文件

    ·c:字符设备文件

    ·p:管道文件

  空文件或目录

    -empty

    find/app-type d -empty

  组合条件:

    与:-a

    或:-o

    非:-not,!

  德.摩根定律

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

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

  示例:

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

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

find示例

  find –name snow.png

  find –iname snow.png

  find / name “*.txt”

  find /var –name “*log*”

  find –user joe –not –group 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 -name0 ‘f’\)—ls

  排除目录

  示例:

    查找/etc下,除/etc/sane.d目录的其它所有conf后缀的文件

    find/etc –path '/etc/sane.d' –a –prune –o –name ‘*.conf'

    查找/etc下,除/etc/sane.d和/etc/fonts两个目录的所有conf后缀的文件

    find/etc\ (-path ‘/etc/sane.d’ –o —path ‘/etc/fonts’)-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,∞)

0%