find文件查找命令
语法:find path [-option] expression action
-[option]
-type
expression arguments
f:可编辑的文件
d:目录
l:软链接文件
b:块设备文件 磁盘,U盘 /dev/sda
c:字符设备文件 终端
s:socket 安全套接字文件
p:管道文件
不写该选项 默认查找全部类型。
# find /run -type s
/run/vmware/guestServicePipe
/run/dbus/system_bus_socket
/run/lvm/lvmpolld.socket
/run/lvm/lvmetad.socket
/run/udev/control
# find /etc -type d|wc -l 查找后统计/etc下目录数量
604
# find /home -type d|xargs ls -l 查找后通过|xargs ls -l 查看详细信息。
/home:
total 0
drwx------. 2 cs cs 83 Apr 12 22:39 cs
drwx------. 2 hhh076 hhh076 62 Apr 6 18:49 hhh076
drwx------. 4 normal normal 108 Mar 27 06:02 normal
drwx------. 2 oldboy oldgirl 83 Apr 13 03:56 oldboy
drwx------. 2 oldboy996 oldboy996 62 Apr 10 14:16 oldboy996
drwxrws---. 2 root oldboyedu 45 Apr 13 02:48 oldboyedu
-size
expression arguments
-:小于
+:大于
Num:精准但是又不精准的匹配
练习
# 1.在/opt下创建1000个文件
touch /opt{1..1000}.txt
# 2.使用find找出(/opt下小于1k的文件)并删除
find /opt/ -size -1k|xargs rm -fr
# 2.使用find找出(/opt下小于1k的文件)把它们全部移动到/tmp下
mv 源文件 目标路径
mv -t 目标路径 源文件
# find /opt/ -size -1k |xargs mv -t /tmp
xargs: -i:指定数据流的位置,将数据流放入{}中
find /opt/ -size -1k |xargs -i mv {} /tmp
-name
expression arguments
-name: 区分大小写
find ./ -name 'txt' 当前目录精确查找txt文件
find ./ -name '*txt' 当前目录查找txt结尾文件
find ./ -name 'txt*' 当前目录查找txt开头文件
find ./ -name '*txt*' 当前目录查找包含txt文件
*号表示匹配任意内容可有可无,和正则表达式中的*不一样。
-iname :不区分大小写
-time
expression arguments
-atime:文件访问时间查找
-mtime:文件内容创建,修改时间查找
-ctime:文件属性,修改时间查找 mtime与ctime一致
Num:查找第N天的文件(不包括今天)
+Num:查找第N天之前的所有文件(不包括今天)
-NUm:查找从今天开始算,7天内的文件
# 一个文件有以下三种时间
access time:atime
modify time:mtime
change time:ctime
# 查看三种时间 [root@localhost ~]# stat
# stat test.txt
File: ‘test.txt’
Size: 190 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 33575032 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2022-04-04 16:14:30.985104552 +0800
Modify: 2022-04-04 16:14:12.621103072 +0800
Change: 2022-04-06 18:51:59.715812354 +0800
Birth: -
练习
for i in `seq -w 30`;do date -s 202204$i && touch file-$i;done
保留近七天的文件
# find /opt ! -mtime -7|xargs rm -f
-user、-group
-user:查找文件的属主
-nouser:文件没有属主用户的
-group:查找文件的属组
-nogroup:文件没有属组的
-perm
expression arguments
#num :精确匹配
find ./ -perm 222
#-num :每个权限位上,包含该数字权限的所有权限
find /home -perm -324
拥有者至少有011(-wx),组010(-w-),其他人100(r--)
#/num: 总共三个权限位,只要有一个权限位的权限被包含,就可以找到
find ./ -perm /644 -ls
属主权限位,有一个r或者有一个w就满足条件
属组权限位,有一个r就满足条件
其他用户权限位,有一个r就满足条件
-maxdepth
expression arguments
针对目录层级查找
# 查找/etc/目录下的所有1级和2级目录
find /etc -type d -maxdepth 2
多条件组合查找
-a:和,并且(默认)
-o:或者
!:取反
!():先翻译括号里的内容再取反。
1、查找文件名是file5或file9的文件
2、查找文件名不是file5或file9的文件
1、查找文件名是file5且是file9的文件(不存在)
2、查找文件名不是file5且file9的文件(该目录下所有文件都符合)
查找文件以file开头且以5结尾的文件
atcion
#-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`
find / -name 'etc' -delete
find: cannot delete ‘/run/initramfs/state/etc’: Directory not empty find: cannot delete ‘/etc’: Directory not empty find: cannot delete ‘/var/tmp/etc’: Directory not empty
#-ok:找到文件后,执行后面的bash命令,询问是否要操作
语法:-ok 系统命令 {} \;
find / -type f -name 'file*' -ok mv {} /tmp \;
#-exec:找到文件后,执行后面的bash命令
语法:-exec 系统命令 {} \;
find / -type f -name 'file*' -exec mv {} /tmp \;
find结合|xargs
xargs将查找到结果一个一个的交给后面的命令处理
# find ./ -name 'file*' |xargs cp -vt cptest
‘./mtest/file-27’ -> ‘cptest/file-27’
‘./mtest/file-28’ -> ‘cptest/file-28’
‘./mtest/file-29’ -> ‘cptest/file-29’
‘./mtest/file-30’ -> ‘cptest/file-30’
‘./file-01’ -> ‘cptest/file-01’
‘./file-02’ -> ‘cptest/file-02’
‘./file-03’ -> ‘cptest/file-03’
‘./file-04’ -> ‘cptest/file-04’
‘./file-05’ -> ‘cptest/file-05’
‘./file-06’ -> ‘cptest/file-06’
‘./file-07’ -> ‘cptest/file-07’
‘./file-08’ -> ‘cptest/file-08’