一、文件查找

1、locate

locate 查询系统上预建的文件索引数据库 /var/lib/mlocate/mlocate.db

索引的构建是在系统较为空闲时自动进行(周期性任务),执行updatedb可以更新数据库

索引构建过程需要遍历整个根文件系统,很消耗资源

工作特点:

查找速度快

模糊查找

非实时查找

搜索的是文件的全路径,不仅仅是文件名1

可能只搜索用户具备读取和执行权限的目录

格式:

locate [OPTION]... [PATTERN]...

常用选项

-i 不区分大小写的搜索

-n N 只列举前N个匹配项目

-r 使用基本正则表达式

范例:

#搜索名称或路径中包含“conf”的文件

locate conf

#使用Regex来搜索以“.conf”结尾的文件

locate -r '\.conf$'

2、find

find 是实时查找工具,通过遍历指定路径完成文件查找

工作特点:

查找速度略慢

精确查找

实时查找

查找条件丰富

可能只搜索用户具备读取和执行权限的目录

格式:find [OPTION]... [查找路径] [查找条件] [处理动作]

查找路径:指定具体目标路径;默认为当前目录

查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所

有文件

处理动作:对符合条件的文件做操作,默认输出至屏幕

2.1指定搜索目录层

-maxdepth level 最大搜索目录深度,指定目录下的文件为第1级

-mindepth level 最小搜索目录深度

范例:

find /etc  -maxdepth 2 -mindepth 2

2.2根据文件名和inode查找文件

-name "文件名称":支持使用glob,如:*, ?, [], [^],通配符要加双引号引起来

-iname "文件名称":不区分字母大小写

-inum n 按inode号查找

-samefile name 相同inode号的文件

-links n   链接数为n的文件

-regex “PATTERN”:以PATTERN匹配整个文件路径,而非文件名称

2.3根据文件属主属组查找

-user USERNAME:查找属主为指定用户(UID)的文件

-group GRPNAME: 查找属组为指定组(GID)的文件

-uid UserID:查找属主为指定的UID号的文件

-gid GroupID:查找属组为指定的GID号的文件

-nouser:查找没有属主的文件

-nogroup:查找没有属组的文件

2.4根据文件类型查找

-type TYPE

TYPE可以是以下形式:

f: 普通文件

d: 目录文件

l: 符号链接文件

s:套接字文件

b: 块设备文件

c: 字符设备文件

p: 管道文件

2.5空目录或文件

-empty

范例:

find /app -type d -empty

2.6组合条件

与:-a ,默认多个条件是与关系

或:-o

非:-not 或者  !

范例:

[root@centos8 ~]#find /etc/ -type d -o -type l |wc -l

307

[root@centos8 ~]#find /etc/ -type d -o -type l -ls |wc -l

101

[root@centos8 ~]#find /etc/ \( -type d -o -type l \)   -ls |wc -l

307

德·摩根定律:

(非 A) 或 (非 B) = 非(A 且 B)

(非 A) 且 (非 B) = 非(A 或 B)

示例:

!A -a !B = !(A -o B)

!A -o !B = !(A -a B)

范例:

[root@centos8 home]#ll

total 0

drwx------. 2 mage     mage     62 Jan 16 17:53 mage

drwx------. 2 wang     wang     62 Jan 16 10:43 wang

drwx------  2 xiaoming xiaoming 62 Apr  6 09:51 xiaoming

[root@centos8 home]#find ! \( -user wang -o -user mage \)

.

./xiaoming

./xiaoming/.bash_logout

./xiaoming/.bash_profile

./xiaoming/.bashrc

[root@centos8 home]#find ! -user wang -a ! -user mage

.

./xiaoming

./xiaoming/.bash_logout

./xiaoming/.bash_profile

./xiaoming/.bashrc

2.7根据文件大小查找

-size [+|-]#UNIT

常用单位:k, M, G,c(byte),注意大小写敏感

#UNIT: (#-1, #]

如:6k 表示(5k,6k]

-#UNIT:[0,#-1]

如:-6k 表示[0,5k]

+#UNIT:(#,∞)

如:+6k 表示(6k,∞)

范例:

find /  -size +10G

2.8排除目录

#查找/etc/下,除/etc/sane.d目录的其它所有.conf后缀的文件

find /etc -path '/etc/sane.d' -a -prune -o -name "*.conf"

#查找/etc/下,除/etc/sane.d和/etc/fonts两个目录的所有.conf后缀的文件

find /etc \( -path "/etc/sane.d" -o -path "/etc/fonts" \) -a -prune -o -name

"*.conf"

#排除/proc和/sys目录

find / \( -path "/sys" -o -path "/proc" \) -a -prune -o -type f -a -mmin -1

2.9根据时间查找文件

以“天”为单位

-atime [+|-]#

#: [#,#+1)

+#: [#+1,∞]

-#: [0,#)

-mtime

-ctime

以“分钟”为单位

-amin

-mmin

-cmin

2.10根据文件权限查找

 -perm [/|-]MODE

MODE: 精确权限匹配

/MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可,或关系,+ 从CentOS 7开始淘汰

-MODE:每一类对象都必须同时拥有指定权限,与关系

0 表示不关注

说明:

fifind -perm 755 会匹配权限模式恰好是755的文件

只要当任意人有写权限时,fifind -perm /222就会匹配

只有当每个人都有写权限时,fifind -perm -222才会匹配

只有当其它人(other)有写权限时,fifind -perm -002才会匹配

范例:

文件查找locate和find ,参数替换xargs_搜索

2.11搜索文件处理动作

-print:默认的处理动作,显示至屏幕

-ls:类似于对查找到的文件执行“ls -l”命令

-fls file:查找到的所有文件的长格式信息保存至指定文件中,相当于 -ls > file

-delete:删除查找到的文件,慎用!

-ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令,对于每个文件执行命令之前,都会

交互式要求用户确认

-exec COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令

{}: 用于引用查找到的文件名称自

三、参数替换xargs

由于很多命令不支持管道|来传递参数,xargs用于产生某个命令的参数,xargs 可以读入 stdin 的数

据,并且以空格符或回车符将 stdin 的数据分隔成为参数

另外,许多命令不能接受过多参数,命令执行可能会失败,xargs 可以解决

注意:文件名或者是其他意义的名词内含有空格符的情况

fifind 和 xargs 的组合:

find | xargs COMMAND

范例:

#显示10个数字

[root@centos8 ~]#seq 10 | xargs

1 2 3 4 5 6 7 8 9 10

#删除当前目录下的大量文件

ls | xargs   rm

#

find  -name "*.sh" | xargs ls -Sl

[root@centos8 data]#echo {1..10} |xargs

1 2 3 4 5 6 7 8 9 10

[root@centos8 data]#echo {1..10} |xargs -n1

1

2

3

4

5

6

7

8

9

10

[root@centos8 data]#echo {1..10} |xargs -n2

1 2

3 4

5 6

7 8

9 10

#批量创建和删除用户

echo user{1..10} |xargs -n1 useradd

echo user{1..100} | xargs -n1 userdel -r

#这个命令是错误的

find /sbin/ -perm /700 | ls -l      

#查找有特殊权限的文件,并排序

find /bin/ -perm /7000 | xargs ls -Sl    //

#此命令和上面有何区别?

find /bin/ -perm -7000 | xargs ls -Sl  

#以字符nul分隔

find -type f -name "*.txt” -print0 | xargs -0 rm

#并发执行多个进程

seq 100 |xargs -i -P10 wget -P /data   http://10.0.0.8/{}.html

#并行下载视频

seq 199 | xargs -i -P3 you-get https://www.bilibili.com/video/BV1Et411E7dx?p={}