Linux-文本查找
文件命名规则
-
长度不能超过255个字符;
-
不能使用/当文件名;
-
严格区分大小写
文本查找
grep
根据模式搜索文本,并将符合模式的文本行显示出来
使用基本正则表达式定义的模式来过滤文本的命令
[root@localhost ~]# ls
abc aBc AbC ABc ABC abc-12345 anaconda-ks.cfg hello passwd test
[root@localhost ~]# ls|grep abc
abc
abc-12345
-i(ignore case)
忽略大小写
[root@localhost ~]# ls|grep -i abc
abc
aBc
AbC
ABc
ABC
abc-12345
精准查找
(例如c$表示查找以c结尾的文件)
(例如^a表示查找以a开头的文件)
[root@localhost ~]# ls|grep -i ^a
abc
aBc
AbC
ABc
ABC
abc-12345
anaconda-ks.cfg
[root@localhost ~]# ls|grep -i c$
abc
aBc
AbC
ABc
ABC
--color
匹配到的内容高亮显示
alias grep='grep --color=auto'
[root@localhost ~]# alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='(alias; declare -f) | /usr/bin/which --tty-only --read-alias --read-functions --show-tilde --show-dot'
alias xzegrep='xzegrep --color=auto'
alias xzfgrep='xzfgrep --color=auto'
alias xzgrep='xzgrep --color=auto'
alias zegrep='zegrep --color=auto'
alias zfgrep='zfgrep --color=auto'
alias zgrep='zgrep --color=auto'
-v(invert)
反过来,只打印没有匹配的,而匹配的反而不打印
[root@localhost ~]# ls
123456 abc AbC ABC anaconda-ks.cfg passwd
20201106 aBc ABc abc-12345 hello test
[root@localhost ~]# ls|grep -iv abc
123456
20201106
anaconda-ks.cfg
hello
passwd
test
-o(only)
只显示被模式匹配到的字符串
[root@localhost ~]# ls|grep abc
abc
abc-12345
[root@localhost ~]# ls|grep -o abc
abc
abc
-E(Extend)
使用扩展正则表达式
[root@localhost ~]# ls
123456 abc AbC ABC anaconda-ks.cfg hello passwd xBi
20201106 aBc ABc abc-12345 hBj lBv test
[root@localhost ~]# ls|grep 'xBi|lBv' // "|"属于正则表达式中的,需要用-E开启扩展才能使用
[root@localhost ~]# ls|grep -E 'xBi|lBv' // 查找xBi和lBv文件
lBv
xBi
[root@localhost ~]# ls|grep -E '^.B.$' //"."表示任意字符
aBc
ABc
ABC
hBj
lBv
xBi
[root@localhost ~]# ls|grep -E '^AB.$|^lB.$' //查找AB.和lb.文件
ABc
ABC
lBv
-q(quiet)
静默模式,不输出任何信息
[root@localhost ~]# ls
123456 abc AbC ABC anaconda-ks.cfg hello passwd xBi
20201106 aBc ABc abc-12345 hBj lBv test
[root@localhost ~]# ls|grep -q 'abc'
[root@localhost ~]# echo $?
0 // echo $?输出0表示找到了
[root@localhost ~]# ls|grep -q 'qwerdf'
[root@localhost ~]# echo $?
1 // echo $?输出1表示没找到
-A(After)
显示匹配到的字符串所在的行及其后n行
[root@localhost ~]# cat abc
20201106
yqh hqy
abc cba
Liunx xnuiL
xxx yyy
[root@localhost ~]# grep -A1 'yqh' abc
yqh hqy
abc cba
-B(Before)
显示匹配到的字符串所在的行及其前n行
[root@localhost ~]# grep -B1 'yqh' abc
20201106
yqh hqy
-C(Context)
显示匹配到的字符串所在的行及其前后各n行
[root@localhost ~]# grep -C1 'yqh' abc
20201106
yqh hqy
abc cba
find
实时查找,精确性强,遍历指定目录中所有文件完成查找
查找速度慢,支持众多查找标准
-name
对文件名作精确匹配
[root@localhost ~]# find / -name abc
/root/abc
/opt/abc
-iname
文件名匹配时不区分大小写
[root@localhost ~]# find / -iname abc
/root/abc
/opt/abc
/opt/aBc
/opt/AbC
/opt/ABc
/opt/ABC
-user
根据属主来查找
[root@localhost ~]# useradd yqh
[root@localhost ~]# ll /home/
total 0
drwx------. 2 yqh yqh 62 Nov 6 21:44 yqh
[root@localhost ~]# find / -user yqh
/home/yqh
/home/yqh/.bash_logout
/home/yqh/.bash_profile
/home/yqh/.bashrc
find: ‘/proc/5616/task/5616/fd/7’: No such file or directory
find: ‘/proc/5616/task/5616/fdinfo/7’: No such file or directory
find: ‘/proc/5616/fd/6’: No such file or directory
find: ‘/proc/5616/fdinfo/6’: No such file or directory
/var/spool/mail/yqh
[root@localhost ~]# ll /home/yqh/ -a
total 12
drwx------. 2 yqh yqh 62 Nov 6 21:44 .
drwxr-xr-x. 3 root root 17 Nov 6 21:44 ..
-rw-r--r--. 1 yqh yqh 18 Aug 30 2019 .bash_logout
-rw-r--r--. 1 yqh yqh 141 Aug 30 2019 .bash_profile
-rw-r--r--. 1 yqh yqh 312 Aug 30 2019 .bashrc
-group
根据属组来查找
[root@localhost ~]# find / -group yqh
/home/yqh
/home/yqh/.bash_logout
/home/yqh/.bash_profile
/home/yqh/.bashrc
find: ‘/proc/5622/task/5622/fd/7’: No such file or directory
find: ‘/proc/5622/task/5622/fdinfo/7’: No such file or directory
find: ‘/proc/5622/fd/6’: No such file or directory
find: ‘/proc/5622/fdinfo/6’: No such file or directory
[root@localhost ~]# ll /var/spool/mail/yqh
-rw-rw----. 1 yqh mail 0 Nov 6 21:44 /var/spool/mail/yqh
用户归属
[root@localhost ~]# ll
total 8
-rw-r--r--. 1 root root 45 Nov 6 21:19 abc
-rw-------. 1 root root 1196 Nov 6 21:13 anaconda-ks.cfg
[root@localhost ~]# chown yqh abc
[root@localhost ~]# chown .yqh anaconda-ks.cfg
[root@localhost ~]# ll
total 8
-rw-r--r--. 1 yqh root 45 Nov 6 21:19 abc
-rw-------. 1 root yqh 1196 Nov 6 21:13 anaconda-ks.cfg
[root@localhost ~]# userdel -r yqh
[root@localhost ~]#
[root@localhost ~]# ll
total 8
-rw-r--r--. 1 1000 root 45 Nov 6 21:19 abc
-rw-------. 1 root 1000 1196 Nov 6 21:13 anaconda-ks.cfg
[root@localhost ~]# id 1000
id: ‘1000’: no such user
-nouser
查找没有属主的文件,用户被删除的情况下产生的文件,只有uid没有属主
[root@localhost ~]# find -nouser
./abc
-nogroup
查找没有属组的文件,组被删除的情况下产生的文件,只有gid没有属组
[root@localhost ~]# find -nogroup
./anaconda-ks.cfg
-type
根据文件类型来查找(f,d,l,b,c,p,s)
1) 普通文件(f):用cat、less、vi等查看或修改内容
2) 目录文件(d):表示管理系统中的全部文件,包括文件名、子目录名及其指针
3) 链接文件(l):软链接、硬链接(->)
4) 设备文件(b): 支持并行,随机访问
5) 串行端口设备(c):只能串行,不能随机访问,如鼠标、键盘
6) 管道文件(p):先进先出
7) 套接字文件(s):计算机内部通信时使用,和外部基于协议通信形成对比
-s(soft)
软链接与硬链接
[root@localhost ~]# ln -s abc yqh //软链接
[root@localhost ~]# ll
total 8
-rw-r--r--. 1 yqh root 45 Nov 6 21:19 abc
-rw-------. 1 root yqh 1196 Nov 6 21:13 anaconda-ks.cfg
lrwxrwxrwx. 1 root root 3 Nov 6 22:05 yqh -> abc
[root@localhost ~]# ln abc hqy //硬链接
[root@localhost ~]# ll
total 12
-rw-r--r--. 2 yqh root 45 Nov 6 21:19 abc
-rw-------. 1 root yqh 1196 Nov 6 21:13 anaconda-ks.cfg
-rw-r--r--. 2 yqh root 45 Nov 6 21:19 hqy
lrwxrwxrwx. 1 root root 3 Nov 6 22:05 yqh -> abc
[root@localhost ~]# rm -f abc
[root@localhost ~]# ll
total 8
-rw-------. 1 root yqh 1196 Nov 6 21:13 anaconda-ks.cfg
-rw-r--r--. 1 yqh root 45 Nov 6 21:19 hqy
lrwxrwxrwx. 1 root root 3 Nov 6 22:05 yqh -> abc(在闪烁)
[root@localhost ~]# find -type l
./yqh
[root@localhost ~]# find -type f
./.bash_logout
./.bash_profile
./.bashrc
./.cshrc
./.tcshrc
./anaconda-ks.cfg
./hqy
[root@localhost ~]# find -type d
.
-size
根据文件大小进行查找.如1k、1M,+10k、+10M,-1k、-1M,+表示大于,-表示小于
[root@localhost ~]# dd if=/dev/zero of=/opt/abc bs=1024M count=2
2+0 records in
2+0 records out
2147483648 bytes (2.1 GB, 2.0 GiB) copied, 1.45364 s, 1.5 GB/s
[root@localhost ~]# ll -h /opt/
total 2.1G
-rw-r--r--. 1 root root 2.0G Nov 6 22:20 abc
-rw-------. 1 root root 1.2K Oct 26 18:50 anaconda-ks.cfg
-rw-r--r--. 1 root root 169K Nov 6 22:21 qwe
[root@localhost ~]# find /opt -size +1G //查找大于1G的文件
/opt/abc
[root@localhost ~]# find /opt -size 2G //查找2G的文件
/opt/abc
[root@localhost ~]# find /opt -size +2G //查找大于2G的文件
[root@localhost ~]# find /opt -size -2G //查找小于1G的文件
/opt
/opt/anaconda-ks.cfg
/opt/qwe
-mtime
修改时间
[root@localhost ~]# find /opt -mtime +1 //查找1天以前修改过的文件
/opt
/opt/abc
/opt/qwe
[root@localhost ~]# find /opt -mtime -1 //查找1天以内修改过的文件
/opt/anaconda-ks.cfg
-mmin
多少分钟修改过
[root@localhost ~]# find /opt -mmin +5 //查找5分钟以前修改过的文件
/opt
/opt/abc
/opt/anaconda-ks.cfg
/opt/qwe
[root@localhost ~]# find /opt -mmin -5 //查找5分钟以内修改过的文件
/opt
组合条件:
-a
表示两个条件同时满足
[root@localhost ~]# find / -name abc -size +1G //中间默认情况下是-a
/opt/abc
[root@localhost ~]# find / -name abc -a -size +1G
/opt/abc
-o
表示两个条件满足其中一个
[root@localhost ~]# find / -name abc -o -size +1G
/proc/kcore
find: ‘/proc/5727/task/5727/fd/6’: No such file or directory
find: ‘/proc/5727/task/5727/fdinfo/6’: No such file or directory
find: ‘/proc/5727/fd/5’: No such file or directory
find: ‘/proc/5727/fdinfo/5’: No such file or directory
/opt/abc
[root@localhost ~]# ll -h /proc/kcore
-r--------. 1 root root 128T Nov 6 17:34 /proc/kcore ///proc文件里的都是假的不要管它
-not
表示满足前面一个条件
[root@localhost ~]# find / -name abc -not -size +1G //查找文件名为abc且大小不为1G的文件
/root/abc
处理动作:默认为显示到屏幕上
-print 显示
[root@localhost ~]# find -type l
./yqh
[root@localhost ~]# find -type l -print
./yqh
-ls
显示每一个文件的详细信息
[root@localhost ~]# find -type l -ls
101262838 0 lrwxrwxrwx 1 root root 3 Nov 6 22:05 ./yqh -> abc
-delete
删除查找到的文件
[root@localhost ~]# mkdir abc
[root@localhost ~]# touch abc/123
[root@localhost ~]# ls
abc anaconda-ks.cfg hqy yqh
[root@localhost ~]# find -type d -delete
find: cannot delete ‘./abc’: Directory not empty //删除不了有文件的目录
-fls
查找到的所有文件的长格式信息保存至指定文件中
[root@localhost ~]# ls
abc anaconda-ks.cfg hqy yqh
[root@localhost ~]# find -type d -fls xixi
[root@localhost ~]# ls
abc anaconda-ks.cfg hqy xixi yqh
[root@localhost ~]# cat xixi
100663425 0 dr-xr-x--- 3 root root 159 Nov 6 22:55 .
67534016 0 drwxr-xr-x 2 root root 17 Nov 6 22:53 ./abc
-ok
对查找到的每个文件执行COMMAND,每次操作都需要用户确认
[root@localhost ~]# find -name xixi
./xixi
/tmp/xixi
[root@localhost ~]# find -name xixi -ok rm -rf xixi ;
< rm ... ./xixi > ? y //需要输入y/n确定或取消
< rm ... ./tmp/xixi > ? y
[root@localhost ~]# ls
abc anaconda-ks.cfg hqy yqh
-exec
对查找到的每个文件执行COMMAND,操作不需要确认
[root@localhost ~]# find -name xixi
./xixi
/tmp/xixi
[root@localhost ~]# find -name xixi -exec rm -rf xixi ;
[root@localhost ~]# ls
abc anaconda-ks.cfg hqy yqh
[root@localhost ~]# find -type d -exec rm -r {} ; &>/dev/null
[root@localhost ~]# ls
anaconda-ks.cfg
[root@localhost ~]# vi abc
[root@localhost ~]# cat abc
hello world
[root@localhost ~]# find -name abc -exec mv {} 123 ; //把找到的文件改名为123
[root@localhost ~]# ls
123 anaconda-ks.cfg
[root@localhost ~]# mkdir abc
[root@localhost ~]# find /opt -type f -exec cp {} ./abc/ ; //把找到的文件复制到abc中
[root@localhost ~]# ls abc
abc anaconda-ks.cfg qwe
-xargs
通过管道将查找到的内容给xargs处理,xargs后面直接跟命令即可
注意:find传递查找到的文件至后面指定的命令时,查找到所有
符合条件的文件一次性传递给后面的命令,而有些命令不能接受过多参数
此时命令执行可能会失败。而xargs可规避此问题
[root@localhost ~]# ls
123 anaconda-ks.cfg hqy yqh
[root@localhost ~]# find -name 123|xargs rm -rf
[root@localhost ~]# ls
anaconda-ks.cfg hqy yqh