文件查找find,locate,命令传递参数xargs

非实时查找(数据库查找):locate

locate特点:

  • 查找速度快
  • 模糊查找
  • 非实时查找
  • 搜索的是文件的全路径,不仅仅是文件名 

locate用法 

-i 不区分大小写的搜索
-n N 只列举前N个匹配项目
-r 使用基本正则表达式

搜索名称或路径中包含“conf"的文件
locate conf
#使用Regex来搜索以“.conf"结尾的文件
locate -r '\.conf$' 

[root@centos8 ~]#touch test2.log
[root@centos8 ~]#locate test2.log
[root@centos8 ~]#updatedb             #更新数据库
[root@centos8 ~]#locate test2.log
/root/test2.log

实时查找:find

find特点:

  • 查找速度略慢
  • 精确查找
  • 实时查找
  • 查找条件丰富
  • 可能只搜索用户具备读取和执行权限的目录

指定搜索目录层级

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

跟据文件和inode查找 

 -name "文件名称" #支持使用glob,如:*, ?, [], [^],通配符要加双引号引起来
-iname "文件名称" #不区分字母大小写
-inum n #按inode号查找
-samefile name #相同inode号的文件
-links n #链接数为n的文件
-regex “PATTERN" #以PATTERN匹配整个文件路径,而非文件名称

根据所属主,组查找 

-user USERNAME #查找属主为指定用户(UID)的文件
-group GRPNAME #查找属组为指定组(GID)的文件
-uid UserID #查找属主为指定的UID号的文件
-gid GroupID #查找属组为指定的GID号的文件
-nouser #查找没有属主的文件
-nogroup #查找没有属组的文件

根据文件类型查找 

-type 命令告诉 find 在找到的每个文件上执行后面的 xx 命令。
TYPE可以是以下形式:
f: 普通文件
d: 目录文件
l: 符号链接文件
s:套接字文件
b: 块设备文件
c: 字符设备文件
p: 管道文件 

#查看/home的目录
find /home –type d -ls

与或非 

与:-a ,默认多个条件是与关系,所以可以省略-a
或:-o
非:-not ! 

#查找/etc/下,除/etc/security目录的其它所有.conf后缀的文件
find /etc -path '/etc/security' -a -prune -o -name "*.conf"

 根据文件大小来查找

-size [+|-]#UNIT #常用单位:k, M, G,c(byte),注意大小写敏感
#UNIT: #表示(#-1, #],如:6k 表示(5k,6k]
-#UNIT #表示[0,#-1],如:-6k 表示[0,5k]
+#UNIT #表示(#,∞),如:+6k 表示(6k,∞) 

find / -size +10G
[root@centos8 ~]#find / -size +10G
/proc/kcore
find: ‘/proc/25229/task/25229/fd

find /etc -type f -size +1M -ls   #普通文件,且大于1M

 跟权限查找

find -perm 755 会匹配权限模式恰好是755的文件
只要当任意人有写权限时,find -perm /222就会匹配
只有当每个人都有写权限时,find -perm -222才会匹配
只有当其它人(other)有写权限时,find -perm -002才会 匹配

处理动作 

-print:默认的处理动作,显示至屏幕
-ls:类似于对查找到的文件执行"ls -dils"命令格式输出
-fls file:查找到的所有文件的长格式信息保存至指定文件中,相当于 -ls > file
-delete:删除查找到的文件,慎用!
-ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令,对于每个文件执行命令之前,都会
交互式要求用户确认
-exec COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令
{}: 用于引用查找到的文件名称自身 

#把etc里面后缀是.conf的后面加上.orig
find /etc/ -name "*.conf" -exec cp {} {}.orig \;
-name "*.conf" 用于找到以".conf"结尾的文件。
-exec cp {} {}.orig \; 用于将找到的文件复制到相同目录并加上".orig"后缀。

#提示删除存在时间超过3天以上的joe的临时文件
find /tmp -ctime +3 -user joe -ok rm {} \;

#在主目录中寻找可被其它用户写入的文件
find ~ -perm -002 -exec chmod o-w {} \;

#查找/data下的权限为644,后缀为sh的普通文件,增加执行权限
find /data –type f -perm 644 -name "*.sh" –exec chmod 755 {} \;

 根据时间戳

#以“天"为单位
-atime [+|-]#
#  #表示[#,#+1)
+# #表示[#+1,∞]

#根据权限查找
-# #表示[0,#)
-mtime    #选项用于搜索文件的修改时间文件目录,单位以24小时计算;
-ctime     #用于搜索文件的改变时间文件或目录,单位以24小时计算

                 文件元数据(如权限、所有者、链接等)被修改的时间

#以“分钟"为单位
-amin     #查找在指定时间曾被存取过的文件或目录,单位以分钟计算
-mmin    #查找在指定时间曾被更改过的文件或目录,单位以分钟计算
-cmin     #查找在指定时间之时被更改过的文件或目录;

find /var ! \( -user root -o -user postfix \) -mtime -7 -ls  不是 7天访问

xargs 给其他命令传递参数的一个过滤器

cat test.txt | xargs  多行输入单行输出:
cat test.txt | xargs -n3  -n 选项 多行输出:
a b c
d e f
g h i
j k l
echo "nameXnameXnameXname" | xargs -dX  -d 选项 可以自定义一个定界符:
  name name name name
#用 rm 删除太多的文件时候,可能得到一个错误信息:/bin/rm Argument list too long. 用 xargs 去避免这个问题:
find . -type f -name "*.log" -print0 | xargs -0 rm -f
 
#统计一个源代码目录中所有 php 文件的行数:
find . -type f -name "*.php" -print0 | xargs -0 wc -l
 
#查找所有的 jpg 文件,并且压缩它们:
find . -type f -name "*.jpg" -print | xargs tar -czvf images.tar.gz
 
 
#结合 -t 选项可以打印出 xargs 执行的命令
ls | xargs -t -I{} echo {}
 
#-p 选项会在执行每一个命令时弹出确认,当你需要非常准确的确认每一次操作时可以使用 -p 参数,比##如,查找当前目录下 .log 文件,每一次删除都需要确认:
find . -maxdepth 1 -name "*.log" | xargs -p -I{} rm {}

多行输入单行输出:
 

你可能感兴趣的:(linux,运维,服务器)