系统学习----通配符及find命令

一、通配符

通配符: 是shell在做匹配的时候会用到,一般用于匹配文件名
它是由shell进行解析的,比如 find ls cp 等等命令都可以配合着通配符一起使用

shell常见的通配符

* : 匹配0或者多个字符 
?: 匹配任意1个字符
[list]: 匹配list中任意单个字符 
[c1-c2]: 匹配c1-c2中任意单个字符
[^c1-c2]: 不匹配c1-c2中任意单个字符
{string1,string2....} : 匹配{}中任意单个字符 
[root@test tmp]# touch 1.txt 11.txt 111.txt
[root@test tmp]# ll
total 0
-rw-r--r--. 1 root root 0 Feb  8 06:34 111.txt
-rw-r--r--. 1 root root 0 Feb  8 06:34 11.txt
-rw-r--r--. 1 root root 0 Feb  8 06:34 1.txt
[root@test tmp]# ll *.txt
-rw-r--r--. 1 root root 0 Feb  8 06:34 111.txt
-rw-r--r--. 1 root root 0 Feb  8 06:34 11.txt
-rw-r--r--. 1 root root 0 Feb  8 06:34 1.txt
[root@test tmp]# ll 1?.txt
-rw-r--r--. 1 root root 0 Feb  8 06:34 11.txt

匹配条件:
1. *
2. ?.txt
3. [123]1.txt --> 11.txt 21.txt 31.txt
4. [1-9].txt --> 1.txt 2.txt … 9.txt
5. [^a-z].txt --> 除了a.txt … z.txt文件
6. {A,B,C}.txt --> A.txt B.txt C.txt文件

shell元字符

IFS : <tab>/<space>/<enter>
CR: <enter>
= :设定变量
$ : 获取变量
>< : 重定向
| : 管道
& : 后台执行命令
() : 在子shell中执行命令/运算或命令替换等
{}:  函数中执行/变量替换的范围定界
; : 命令结束后,忽略其返回值,继续执行下一个命令
&& : 命令结束后,若为true,继续执行下一个命令
|| :  命令结束后,若为false,继续执行下一个命令
! : 非 
# :注释
\ : 转义 

shell转义符

硬转义: 内部所有shell元字符、通配符等 都会被关闭掉  ' '
软转义: 内部所有shell元字符、通配符等 都正常生效  " "

案例:

[root@test test1]# a=1
[root@test test1]# echo '$a'
$a
[root@test test1]# echo "$a"
1

二、find命令

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

  • 工作特点:
    查找速度略慢
    精确查找
    实时查找
[root@test tmp]# find --help
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

find [选项] [路径] [查找条件 + 处理动作]

路径: 指定具体目录路径,默认是当前文件夹
查找条件: 指定查找的标准(文件名/大小/文件类型/权限等等),默认是找出所有文件
处理动作: 对符合条件的文件做什么操作,默认是输出屏幕


查找条件

  • 根据文件名称查找:
    -name “filename” 根据文件名称查找(支持通配符global)
    -iname “filename” 根据文件名称查找;忽略大小写(支持通配符global)
    -regex “PATTERN” 以pattern匹配整个文件路径字符串,而不仅仅是文件名称
[root@test tmp]# find ./ -name "1[123].txt"

  • 根据属主和属组查找:
    -user username : 查找属主为指定用户的文件
    -group groupname: 查找属组为指定用户的文件
    -uid UID : 查找属主为指定UID号的文件
    -gid GID :查找数组为指定GID号的文件
    -nouser: 查找没有属主的文件
    -nogroup: 查找没有属组的文件

  • 根据文件类型查找:
    -type TYPE :
    TYPE: f d l s b c p
    * f: 普通文件

d: 目录文件
l: 符号链接文件
s:套接字文件
b: 块设备文件
c: 字符设备文件
p: 管道文件


  • 组合条件:
    与:-a
    或:-o
    非: -not

相关案例:找出/tmp目录下,属主不是root,且文件名不是fstab的文件

[root@test tmp]# find /tmp \( -not -user root -a -not -name "fstab" \) 

注意:因为识别问题后面的条件要加 ( ) ,即小括号并转义。


  • 根据文件大小查找:
    -size [+|-]N[bkMG]
    寻找/下文件大小超过10M的所有文件:
[root@test tmp]# find / -size +10M

  • 根据时间戳:
    访问时间、修改时间、改变时间
    天:
    -atime [+|-]N
    -mtime [+|-]N
    -ctime [+|-]N

      -atime +7 : 表示7天内
    


    -amin [+|-]N
    -mmin [+|-]N
    -cmin [+|-]N


  • 根据权限进行查找:
    • -perm [+|-]MODE
      • MODE : 精确查找
        /MODE : 任何一类(u g o )对象的权限中只要能有一位匹配即可
        -MODE : 每一类对象都必须同时拥有为其制定的权限标准

处理动作

-print: 默认处理动作,显示至屏幕上
-ls: 类似于对查找到的文件执行 ls -l 命令
-delete: 删除查找到的文件
-fls /path/to/somefile : 查找到的所有文件的长格式信息保存至指定文件中 


-ok COMMAND {} \ : 
	对查找到的每个文件执行由COMMAND指定的命令 
	{}: 用于引用查找到的文件名称自身
	交互式,每个文件执行命令前会让用户确定

-exec COMMAND {} \: 
	对查找到的每个文件执行由COMMAND指定的命令 
	{}: 用于引用查找到的文件名称自身

实例1: 对/tmp目录下所有属主为root用户的文件修改其属主为zhangsan

[root@test tmp]# find /tmp -user root -ok chown zhangsan: {} \;

这里 {} \ 之间要有空格


实例2: 对/tmp目录下所有属主为zhangsan用户或者属主为zhangsan的文件修改其为root:root

[root@test tmp]# find /tmp -user zhangsan -o -group zhangsan -exec chown root:root {} \;

注意:find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令;
另一种 方式可规避此问题 find | xargs COMMAND
等同于上面实例2的操作
[root@test tmp]# find /tmp -user zhangsan -o -group zhangsan | xargs chown root:root

练习题:

  1. 查找/var目录下属主为root,且属组为mail的所有文件或目录
  2. 查找/usr目录下不属于root,bin或Hadoop的所有文件或目录
  3. 查找/etc目录下周一内容曾被访问过的文件或目录
  4. 查找当前系统上没有属主或属组,且近一周内曾被访问过的文件或目录
  5. 查找/etc目录下大于1M且类型为普通文件的所有文件或目录
  6. 查找/etc目录下所有用户都没有写权限的文件
  7. 查找/etc目录下至少一类用户没有执行权限的文件
  8. 查找/etc/init.d目录下,所有用户都执行权限,且其它用户写权限的文件
find命令支持通配符的使用。在find命令中,通配符可以用于匹配文件名。引用[2]中提到,对于find命令中的-name选项后面的参数,可以使用通配符*进行模糊匹配。需要注意的是,为了确保通配符不被bash预先扩展,需要将通配符*加上引号。这样find命令才能正确接收到通配符作为参数。其他命令可能不支持通配符的使用,比如ls命令。而在find命令中,通配符会被find命令自身解析,并在指定目录及其子目录中寻找匹配的文件。例如,find . -name "abc*"会在当前目录及其子目录中寻找以abc开头的文件。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [系统学习----通配符及find命令](https://blog.csdn.net/weixin_46097280/article/details/104291374)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [ls命令和find命令通配符和双引号的使用区别](https://blog.csdn.net/isco22/article/details/89876633)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值