shell脚本回顾及find文件查找基本用法| 学习笔记

简介: 快速学习shell脚本回顾及find文件查找基本用法

开发者学堂课程【Linux企业运维实战 - 入门及常用命令shell 脚本回顾及 find 文件查找基本用法】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/550/detail/7617


shell脚本回顾及find文件查找基本用法


内容介绍

一、shell 脚本回顾—bash 如何展开命令行

二、文件查找

 

一、shell 脚本回顾—bash 如何展开命令行

执行顺序

1、把命令行分成单个命令词

2、展开别名

3、展开大括号的声明{}

4、展开波浪符声明~

5、命令替换$()‘’

6、再次把命令行分成命令词

7、展开文件通配*、[abc]等等

8准备I/O重导向(<、>

9、运行命令

注意事项——例子

1、 花括号的扩展

[root@centos7 ]#echo 1.. 10

1 2 3 4 5 6 7 8 9 10

[root@centos7 ]#hostname

centos7.magedu.com

2通配符替代

[root@centos7 ]# 1s ~/*

/root/a.b   /root/anaconda-is.cfg   /root/axb   /root/f2 /root/initial-setup-ks.cfg   /root/ p. txt  

/root/abc   /root/ a.txt.log   /root/ b.txt  /root/ fl. sh

/root/ google. txt   /root/ nmap. log

/root/bin:

arg. sh  backup.sh  fl  f2   f2.sh  link2.sh link.sh read. sh  sumid. sh  yesorno.sh

/ROOT/DESKTOP :

/ROOT/DIR9 :

/ROOT/DOCUMENTS :

/ROOT/DOWNLOADS :

/ROOT/MUSIC :

/ROOT/PICTURES :

/Root/Public :

/ROOT/TEMPLATES :

3、使文件 .vimrc 生效

打开 vm 时会自动打开,不能用 .vimrc 使其生效,因为它不属于 bash 的配置文件,属于vm 的配置文件。不同的应用程序有不同的配置文件,不能混合使用。

 

二、文件查找

本章内容:

·使用 locate 命令

·使用 find 命令

·压缩和解压缩工具

1、在文件系统上找符合条件的文件

2、文件查找:locatefind

非实时找(数据库查找locate

 实时查找:find

)locate

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

/var/lib/mlocate/mlocate.db

2、依赖于事先构建的索引

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

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

4、工作特点

·查找速度快

·模糊查找

·非实时查找

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

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

5、locate KEYWORD

6、有用的选项

> -i不区分大小写的搜索

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

[root@centos7 ]#locate passwd

[root@centos7 ]#locate -n 3 passwd

> -r使用正则表达式

[root@centos7 ]#locate -r ^/etc/.*\.conf$

7、示例

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

 locate conf

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

locate  -r  \.conf$”  

实例应用:

1、可以快速搜索磁盘命令,一回车即可利用索引数据库搜索,查看索引数据库创建时间:

[root@centos7 ]#ntpdate  172.20.0.1

11 Apr 11:00:42 ntpdate[4090]step time server 172.20.0.1 offset

[root@centos7 ]#touch f1.sh

[root@centos7 ]#locate f1.sh

/home/wang/bin/f1.sh

/root/bin/f1.sh 

缺点locate数据库就是每天开机生成的数据库,最近未更新未记录文件无法搜索

2、更新文件

[root@centos7 ~]#updatedb

[root@centos7 ]#/VAR/LIB/MLOCATE/MLOCATE.DB

-rw-r- - - - -. 1 root SLOCATE  2565574  APR 11 2018

/VAR/LIB/MLOCATE/MLOCATE.DB

locate适合搜索变化不频繁的文件,比如系统配置文件

3、只列举前n个匹配项目

[root@centos7 ]#locate passwd

只要文件名里带  passwd 或路径里包含  passwd 就会列举出来,不是精确匹配

只要前三个文件:

[root@centos7 ]#locate -n 3 passwd

/etc/passwd

/etc/passwd-

/etc/pam.d/passwd

4、-r 可以支持使用正则表达式

搜索etc下所有 conf 结尾的文件:

[root@centos7 ]#/etc/*.conf

[root@centos7 ]#locate -r “^/etc/.*\.conf$”^c

[root@centos7 ]#locate conf

find

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

2、工作特点

·查找速度略慢

·精确查找

·实时查找

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

3、语法

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

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

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

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

find命令基本用法:

find命令常见选项:

[-H] [-L] [-Olevel] [-P] [path…] [expression]

path 使用中括号,表示可以省略,即默认当前路径当前文件夹

·查找条件

1、指搜索层级

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

例子

搜索某个文件,可以指定文件名,可以指定最多搜索多少层,默认指定为第一层

[root@centos7 ]#find /etc/ -name passwd

/etc/pam.d/passwd

/etc/passwd

[root@centos7 ]#find /etc/   -maxdepth 1  -name passwd

/etc/passwd

指定最大深度为2:

[root@centos7 ]#find  /data  -maxdepth  2  f1

区别精确与包含

精确[root@centos7 ]#find  /data  -name  f1

包含[root@centos7 ]#find  /data  -name  *f1

-mindepth level最小搜索目录深度

2、根据文件名和 inode 查找

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

*,?,[][ ^ ]

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

-inum n按 inode 号节点编号)查找

·实例:

在date下搜索节点编号为69的文件

[root@centos7 ]#find  /data  -inum 69

-samefile name 相同inode号的文件

·实例 

找硬链接,针对f11创建一个硬链接link,节点编号为都是69,链接号增长

[root@centos7 ]#Ln f11_link

[root@centos7 ]#ll -i

[root@centos7 ]#find  -same file  f11

-links n  链接数为n的文件

·实例 

找链接数为2的文件

[root@centos7 ]#find  links 2

./d1/d2/d3

./f11

./f11_link

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

·实例

搜索etc下所有conf结尾的文件

[root@centos7 ]#find /etc/ -regency “.*\.conf$”

[root@centos7 ]#find  /home -user wang -ls

3、根据属主、属组查找

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

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

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

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

-nouser查找没有属主的文件

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

·实例

(1)查找 home 下所有者为 wang 的文件

 [root@centos7 ]#find /home -user wang

 缺点:不知道查找出来的文件的属性是否为wang

完整显示文件名及其属性使用 ls

[root@centos7 ]#find /home -user wang -ls

(2)找 wang并且sh为后缀的文件

 [root@centos7 ]#find  /home -user wang -name *.sh” -ls

-user 与 -name 是两个搜索条件,且二者是并行关系(多个搜索条件)

(3)nouser说明文件的所有者不存在

[root@centos7 ]#useradd haha

[root@centos7 ]#su - haha

[root@centos7 ]$touch f1

[root@centos7 ]$ll  f1

-raw-raw-r- -. 1 haha haha 0 Apr 11:28 f1

[root@centos7 ]#userdel haha

[root@centos7 ]#ll  /home/haha/

total  0

-rw-rw-r- -. 1 1004 1007 0 Apr 11 11:28 f1

[root@centos7 ]#find /home -nouser

(4)新建文件名使其拥有属主

[root@centos7 ]#useradd xixi -u 1004

[root@centos7 ]#find /home/haha -a

[root@centos7 ]#ll /home/haha -a

(5)表示没有属主且没有属组的文件

[root@centos7 ]#find  /home  - nouser  -nogroup

表示没有属主或没有属组的文件

[root@centos7 ]#find  /home  - nouser  -o  -nogroup

(6)改变属组

[root@centos7 ]#usermod -g wang xixi

[root@centos7 ]#id xixi

uid=1004xixi  gid=1000wang  groups=1000wang

4、根据文件类型查找

- type TYPE

·f:普通文件  

·d:目录文件  

·l:符号链接文件  

·s:套接字文件  

·b:块设备文件  

·c:字符设备文件  

·p:管道文件

5、空文件或目录

-empty

find /app-type d    -empty

·实例

1)列文件夹

[root@centos7 ]#find /home -type d -ls

列home目录下的文件夹

[root@centos7 ]#find /home -type d -maxdepth 1

2搜索某个目录下的空文件(面试题)

[root@centos7 ]#find /data -empty type f -ls

3搜索空目录

[root@centos7 ]#mkdir /data/dd1

[root@centos7 ]#find /data -empty

只搜索空目录

[root@centos7 ]#find /data -empty -type d 

6、组合条件

与:-a  

或:-o

非:-not,!

7、德摩根定律:

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

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

示例:

1)!A-aB=(A-oB    

2)!A-oB=!(A-aB 

3)空的但不是普通文件

[root@centos7 ]#find  /data -empty -type f

/data/fstab

非空的普通文件

[root@centos7 ]#find /data -empty -a -type f

/data

/data/d1

/data/d1/d2

/data/d1/d2/d3

(4)德摩根定律

not A或者not B等于not(a和b)

[root@centos7 ]#not A or not B = not (a and b)

[root@centos7 ]#not A and not B = not (a or b)

括号里外符号变化    

不是空的并且不是普通文件:

[root@centos7 ]#find /data ! -empty  ! -type f

[root@centos7 ]#find /data ! -empty -a  ! -type f

find示例(精确匹配)

1、find-name snow.png

find-iname snow.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 \)  

find / -user joe -o -uid 500

2、找出/tmp目录下属主不是root且文件名不以f开头的文件

find /tmp\(-not -user root -a -not -name 'f*\)-ls

find /tmp -not \ ( -user root -o -name 'f*'\)-ls

3、排除目录

示例

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

find /etc -path /etc/sane.d'  -a -prune -o -name "*.conf"

prune 表示剪切,在etc下搜索如果是文件夹/etc/sane.d 就过滤掉剪切掉不去搜索,且只搜索conf后缀的文件

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

find /etc \(-path  /etc/sane.d'  -o -path '  /etc/fonts' \)

-a -prune -o -name  "*.conf"

实例:

1、prune剪切过滤

[root@centos7 ]#find /etc/ -path /etc/sane.d  -name *.conf

2、两个目录都不想要,过滤多个目录

[root@centos7 ]#find /etc/ (-path  \(/etc/sane.d”  -o -path/etc/dbus-1”\) -a -prune -o -name  "*.conf" 

8、根据文件大小来查找

-size[+ -]#UNIT

常用单位k,M,Gc(byte

#UNIT:(#-1,#]

6k表示5k6k]

#UNIT:[0#-1]

-6k表示[0,5k]

+#UNIT(#oo)

+6k表示(6k,oo)

·示例

创建文件夹

[root@centos7 ]#dd if=/dev/zero of=/data/f1 bs=1 count=1023

[root@centos7 ]#find /data -size 1k

/data

/data/d1

/data/d1/d2

/data/d1/d2/d3

/data/dd1

/data/fstab

/data/f1

/data/f2

搜索出的文件并不是只是1k大小

搜索size 1024c 的文件,与搜索1k的结果不一样,按理来说应该一样

[root@centos7 ]#find /data -size 1024c

/data/f1

[root@centos7 ]#find /data -size 1023c

/data/f2

如果搜索标准 size 的文件,搜索结果并不是精确结果,而是-1 的结果,且不包含,(1023,1024] (0,1k]二者不一样

若是搜索减号下的

[root@centos7 ]#find /data -size -1024c

结果表示0 到1024之间,闭区间

相关文章
|
2月前
|
Shell
Shell 文件包含
10月更文挑战第5天
35 4
|
2月前
|
Shell
一个用于添加/删除定时任务的shell脚本
一个用于添加/删除定时任务的shell脚本
97 1
|
1月前
|
Shell Linux 测试技术
6种方法打造出色的Shell脚本
6种方法打造出色的Shell脚本
58 2
6种方法打造出色的Shell脚本
|
20天前
|
XML JSON 监控
Shell脚本要点和难点以及具体应用和优缺点介绍
Shell脚本在系统管理和自动化任务中扮演着重要角色。尽管存在调试困难、可读性差等问题,但其简洁高效、易于学习和强大的功能使其在许多场景中不可或缺。通过掌握Shell脚本的基本语法、常用命令和函数,并了解其优缺点,开发者可以编写出高效的脚本来完成各种任务,提高工作效率。希望本文能为您在Shell脚本编写和应用中提供有价值的参考和指导。
48 1
|
24天前
|
Ubuntu Shell 开发工具
ubuntu/debian shell 脚本自动配置 gitea git 仓库
这是一个自动配置 Gitea Git 仓库的 Shell 脚本,支持 Ubuntu 20+ 和 Debian 12+ 系统。脚本会创建必要的目录、下载并安装 Gitea,创建 Gitea 用户和服务,确保 Gitea 在系统启动时自动运行。用户可以选择从官方或小绿叶技术博客下载安装包。
43 2
|
2月前
|
监控 网络协议 Shell
ip和ip网段攻击拦截系统-绿叶结界防火墙系统shell脚本
这是一个名为“小绿叶技术博客扫段攻击拦截系统”的Bash脚本,用于监控和拦截TCP攻击。通过抓取网络数据包监控可疑IP,并利用iptables和firewalld防火墙规则对这些IP进行拦截。同时,该系统能够查询数据库中的白名单,确保合法IP不受影响。此外,它还具备日志记录功能,以便于后续分析和审计。
49 6
|
1月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
2月前
|
监控 Unix Shell
shell脚本编程学习
【10月更文挑战第1天】shell脚本编程
77 12
|
2月前
|
存储 运维 监控
自动化运维:使用Shell脚本简化日常任务
【9月更文挑战第35天】在IT运维的日常工作中,重复性的任务往往消耗大量的时间。本文将介绍如何通过编写简单的Shell脚本来自动化这些日常任务,从而提升效率。我们将一起探索Shell脚本的基础语法,并通过实际案例展示如何应用这些知识来创建有用的自动化工具。无论你是新手还是有一定经验的运维人员,这篇文章都会为你提供新的视角和技巧,让你的工作更加轻松。
67 2
|
3月前
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余