开发者学堂课程【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
:
/RO
OT/DOWNLOADS
:
/R
OOT/MUSIC
:
/ROOT/PICTURES
:
/Root/Public
:
/ROOT/TEMPLATES :
3、使文件 .vimrc 生效
打开 vm 时会自动打开,不能用 .vimrc 使其生效,因为它不属于 bash 的配置文件,属于vm 的配置文件。不同的应用程序有不同的配置文件,不能混合使用。
二、文件查找
本章内容:
·使用 locate 命令
·使用 find 命令
·压缩和解压缩工具
1、在文件系统上查找符合条件的文件
2、文件查找:locate,find
非实时查找(数据库查找):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 ~
]#
up
d
atedb
[root@centos7
~
]#
/VAR/L
I
B/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=1004
(
xixi
)
gid=1000
(
wang
)
groups=1000
(
wang)
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-a!B=!(A-oB)
(2)!A-o!B=!(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,G,c(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之间,闭区间