day22文件查找


day22文件查找


find基础语法

# 基础语法
find [路径] [选项] [表达式] [动作]

find选项


按文件类型查找

-type:
f: 可编辑的文件
d:目录
l:软连接文件
b:设备文件(block块设备文件)和存储相关的设备;(磁盘分区、硬盘、u盘)
c:设备文件(char字符设备文件)和字符相关的设备;(打印机、终端)
s:socket安全套接字文件,网络编程
p:pipe管道文件,父进程与子进程之间的通信文件

find [选项] [路径]
 ✓ 12:38:24 root@localhost.localdomain,10.0.0.167:~ # find ./ -type f
 
# 查看文件的详细信息
  0 ✓ 12:38:58 root@localhost.localdomain,10.0.0.167:~ # find ./ -type f |xargs ls -l
  
# 查询/etc/目录下,有多少个目录?
  0 ✓ 12:41:29 root@localhost.localdomain,10.0.0.167:~ # find /etc/ -type d |wc -l
596


按文件大小查找

-size
-:小于
+:大于
Num:精准匹配(不是很精准)

# 使用find找出(/opt下小于1k的文件)并删除
  0 ✓ 12:41:34 root@localhost.localdomain,10.0.0.167:~ # find /opt/ -size -1k |xargs rm -rf

# 使用find找出(/opt下小于1k的文件)把它们全部移动到/tmp下
 12:49:30 root@localhost.localdomain,10.0.0.167:~ # find /opt/ -size -1k |xargs mv -t /tmp

# xargs:
-i:指定数据流的位置,将数据流放入{}中
13:20:35 root@localhost.localdomain,10.0.0.167:~ # find /opt/ -size -1k |xargs -i mv {} /tmp


按文件名查找

-name:严格区分大小写
# *:匹配0次或多次
13:22:11 root@localhost.localdomain,10.0.0.167:~ # find ./ -name '*hjx*'
13:22:11 root@localhost.localdomain,10.0.0.167:~ # find ./ -name '*hjx'
13:22:11 root@localhost.localdomain,10.0.0.167:~ # find ./ -name 'hjx*'
13:22:11 root@localhost.localdomain,10.0.0.167:~ # find ./ -name 'hjx'

-iname:不区分大小写
13:22:11 root@localhost.localdomain,10.0.0.167:~ # find ./ -iname 'hjx'

按文件时间查找

-atime:文件访问时间差找
-mtime:文件内容创建,修改时间差找
-ctime:文件属性,修改时间差找

Num:查找第N天的文件(不包括今天)
+Num:查找第N天之前的所有文件(不包括今天) 
-NUm:查找从今天开始算,7天内的文件

# 一个文件有以下三种时间 
access time:atime 
modify time:mtime 
change time:ctime

# 查看三种时间
13:29:06 root@localhost.localdomain,10.0.0.167:~ # stat file1

for i in `seq -w 30`;do date -s 202204$i && touch file-$i;done

# 保留近七天的文件
13:29:17 root@localhost.localdomain,10.0.0.167:~ # find /opt ! -mtime -7|xargs rm -f


按照文件用户和组查找

-user:查找文件的属主 
-nouser:文件没有属主用户的
-group:查找文件的属组 
-nogroup:文件没有属组的

多条件组合查找

# 查询/opt/下面的文件名是dir开头0结尾的普通文件且文件修改时间在7天内,文件大小大于1k
13:32:43 root@localhost.localdomain,10.0.0.167:~ # find /opt/ -name 'dir*' -name '*0' -type f -mtime -7 -size +1K


按权限查找


-perm
# 权限精确查找
13:38:09 root@localhost.localdomain,10.0.0.167:~ # find ./ -perm 222
0 ✓ 13:38:28 root@localhost.localdomain,10.0.0.167:~ # find ./ -perm 644

# -权限
# 每个权限位上,都要包含该数字权限的所有权限
13:38:36 root@localhost.localdomain,10.0.0.167:~ # find ./ -perm 644 -ls
rw-r--r--

# /权限
# 总共三个权限位,只要有一个权限位的权限被包含,就可以找到

13:38:36 root@localhost.localdomain,10.0.0.167:~ # find ./ -perm /644 -ls
属主权限位,有一个r或者有一个w就满足条件 
属组权限位,有一个r就满足条件
其他用户权限位,有一个r就满足条件



按深度查找

-maxdepth

针对目录层级查找 
# 查找/etc/目录下的所有1级和2级目录
13:39:18 root@localhost.localdomain,10.0.0.167:~ # find /etc/ -type d -maxdepth 2


find动作

-print:打印查找到的内容到终端上(find命令默认就是打印结果 -print)

-ls:查看文件的详细信息 |xargs ls -l 或者 ls -l $(find xxx) 或者 ls -l `find xxx`

-delete:删除查找到的文件(bug跟ls,ls看不见的,也删除不掉)并且只能删除空目录
其他删除方法: |xargs rm -fr 或者 rm -fr $(find xxx) 或者 rm -fr `find xxx`

-ok:找到文件后,执行后面的bash命令,询问是否要操作
语法:-ok 系统命令 {} \;
find / -type f -name 'file*' -ok mv {} /tmp \;

-exec:找到文件后,执行后面的bash命令
语法:-exec 系统命令 {} \;
find / -type f -name 'file*' -exec mv {} /tmp \;

find多条件

-a:和,并且(默认)
-o:或者
!:取反

作业


1.查找/tmp目录下,属主不是root,且文件名不是以f开头的文件

0 ✓ 14:04:37 root@localhost.localdomain,10.0.0.167:/tmp # find /tmp/ ! -user root ! -name 'f*'
/tmp/hjx

2.查找/var目录下属主为root,切属组为mail的所有文件

 ✓ 14:07:35 root@localhost.localdomain,10.0.0.167:/tmp # find /var/ -user root -a -group mail
/var/spool/mail

3.查找/var目录下不属于root、oldboy、zls组的所有文件

  0 ✓ 14:20:54 root@localhost.localdomain,10.0.0.167:/tmp # find /var/ ! -group root ! -group oldboy ! -group zls

4.查找/var目录下最近一周内其内容修改过,同时属主不为root,也不是postfix的文件

  1 ✗ 14:28:38 root@localhost.localdomain,10.0.0.167:/tmp # find /var/ -mtime -7 ! -user root ! -user postfix
/var/spool/mail/hjx

5.查找/etc/下所有大于1M且类型为普通文件的所有文件

 ✓ 14:31:22 root@localhost.localdomain,10.0.0.167:/tmp # find /etc/ -type f -size +1M
/etc/udev/hwdb.bin
/etc/selinux/targeted/active/policy.kern
/etc/selinux/targeted/contexts/files/file_contexts.bin
/etc/selinux/targeted/policy/policy.31

6.将/etc中的所有目录(仅目录)复制到/tmp下,目录结构不变

123 ? 14:34:59 root@localhost.localdomain,10.0.0.167:/tmp # find /etc/ -type d |xargs -i cp -a {} /tmp

7.将/etc目录复制到 /var/tmp,/var/tmp/etc的所有目录权限为777,/var/tmp/etc/目录中所有文件权限为666

  0 ✓ 14:37:04 root@localhost.localdomain,10.0.0.167:/tmp # find /etc/ -type d |xargs -i cp -a {} /var/tmp
  
 ✓ 14:49:59 root@localhost.localdomain,10.0.0.167:/tmp # chmod 777 `find /var/tmp/etc -type d`
  0 ✓ 14:50:33 root@localhost.localdomain,10.0.0.167:/tmp # chmod 666 `find /var/tmp/etc -type f`
  
    0 ✓ 14:51:48 root@localhost.localdomain,10.0.0.167:/tmp # find /var/tmp/etc -type d |xargs -i chmod 777 {}
  0 ✓ 14:51:48 root@localhost.localdomain,10.0.0.167:/tmp # find /var/tmp/etc -type f |xargs -i chmod 666 {}

8.创建touch file{1..10}10个文件,保留file9,其他一次全部删除

✓ 15:18:20 root@localhost.localdomain,10.0.0.167:/tmp # find /tmp/ -type f ! -name '*9' |xargs rm -rf

9.解释如下每条命令的含义

mkdir /root/dir1
在/下面的root目录下创建dir1目录

touch /root/dir1/file{1..10}
在/下面的root目录下创建dir1目录下创建file1 到 file10 十个文件

find /root/dir1 -type f -name'file5'
查找root目录下创建dir1目录里面文件名叫'file5'

find /root/dir1 ! -name'file5'
查找root目录下创建dir1目录里面文件名除了'file5'的所有其他文件

find /root/dir1 -name'file5'-o-name'file9'
查找root目录下创建dir1目录里面文件名叫'file5'或文件名叫'file9'

find /root/dir1 -name'file5'-o-name'file9'-ls
查找root目录下创建dir1目录里面文件名叫'file5'或文件名叫'file9',并且查看'file9'

find /root/dir1 (-name 'file5'-o-name'file9' ) -ls
查找root目录下创建dir1目录里面文件名叫'file5'或文件名叫'file9'并查看

find /root/dir1 (-name 'file5'-o-name'file9' ) -exec rm-rvf {} \
删除文件名叫'file5'或文件名叫'file9'

find /root/dir1 ! (-name 'file5'-o-name'file9' ) -exec rm-vf {} \
删除除了文件名叫'file5'或文件名叫'file9'的其他文件

10.使用cat命令如何重定向字符串到文件中?

cat >> 文件名 << EOF

11.请说出cp一个文件都需要什么权限?

r w x

12.请写出将oldboy.txt文件权限改为r-x-w-r--的命令

chmod 524 ./oldboy.txt

14.请创建普通用户oldboy并授权该用户可执行所有超级用户能执行的命令

useradd oldboy -g wheel

15.查找/etc/目录中的passwd文件并把正确输出存放到/tmp/westos.out

find /etc/ -type f -name '*passwd*'> /tmp/westos.out

16.查找/etc/目录中的passwd文件,请屏蔽错误输出

find /etc/ -type f -name '*passwd*' 2> /dev/null

17.查找/etc/目录中的passwd文件,错误输出存放到/tmp/westos.err

find /etc/ -type f -name '*passwd*' 2>/tmp/westos.err

18.查找/etc/目录中的passwd文件,显示所有输出并存放到/tmp/westos.out中

find /etc/ -type f -name '*passwd*' &>/tmp/westos.out


思维导图


posted @ 2022-04-17 13:58  hjx、贤  阅读(126)  评论(0)    收藏  举报