2018年(15)
分类: LINUX
2018-04-14 11:38:22
#文件查找
locate #非实时搜索,基于数据库,索引搜索
- i #忽略字母大小写
- n #显示前几行
- r #locate -r "^/etc/.*\.conf$"
locate + file_name
/var/lib/mlocate/mlocate.db #数据库
updatedb #更新数据库
#适用于搜索变更不频繁的文件[如系统文件]
find
- maxdepth #最大搜索目录深度,指定目录为第1级;默认是递归搜索
- mindepth #最小搜索目录深度
- name #精确匹配,find /data -name "*f1*",利用通配符模糊搜索
- iname #忽略字母大小写
- inum
- samfile file_name #搜索节点编号相同,[硬链接文件]
- links #链接个数
- regex #正则表达式
- prune find /etc -path '/etc/sane.d' -a prune #查找/etc/下,除/etc/sane.d目录其它的所有文件
#根据属主/组查找
-user USERNAME:查找属主为指定用户(UID)的文件
-group GRPNAME: 查找属组为指定组(GID)的文件
-uid UserID: 查找属主为指定的UID号的文件
-gid GroupID: 查找属组为指定的GID号的文件
-nouser: 查找没有属主的文件
-nogroup: 查找没有属组的文件
#根据文件类型查找
-type TYPE:
f: 普通文件
d: 目录文件
l: 符号链接文件
s:套接字文件
b: 块设备文件
c: 字符设备文件
p: 管道文件
#空文件或目录
-empty
find /app -type d -empty
#查找条件
组合条件:
与:-a
或:-o
非:-not, !
#德·摩根定律:
(非 A) 或 (非 B) = 非(A 且 B)
(非 A) 且 (非 B) = 非(A 或 B)
?示例:
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
#查找不属于root,lp,gdm组的文件
find /var -not \( -group root -o -group lp -o -group gdm \) = find /var/ -not -group root -a -not -group lp -a -not -group gdm
eg:
find /data ! empty -type f, find /data empty not -type f; find /home -nouser -g nogroup, find /home -nouser -o nogroup
eg:
find /data -maxdepth 3 -mindepth 3 -name f1 #搜索第3层目录的f1文件
find /data -maxdepth 2 -mindepth 3 -name f1 #搜索第2层目录到第3层目录之间的文件
eg:find /home/ -user user1 -name "*.sh" -ls
#根据文件大小来查找
-size [+|-] unit 常用单位:k, M, G, c 字节[byte] 1024c=1k
#UNIT: (#-1, #]
eg:6k 表示(5k,6k] #6k表示查找[大于5k小于,小于或等于6k]的文件
-#UNIT:[0,#-1]
eg:-6k 表示[0,5k] #-6表示查找[大于或等于0,小于或等于6k]的文件
+#UNIT:(#,∞)
eg:+6k 表示(6k,∞) #+6k表示查找[大于6k,∞]的文件
#新建两个文件大小分别为1023c和1024c
dd if=/dev/zero of=f1 bs=1 count=1023; dd if=/dev/zero of=f2 bs=1 count=1024
find -size 1k #定义搜索大小为1k,发现1023大小字节的文件,也会被搜索列出来
-size 6k #表示(5k,6k],搜索6k文件时,会列出>5k,<=6k的文件
-size -6k #表示[0,5k]
-size +6k #表示(6k,∞)
#根据时间戳
以“天”为单位
-atime [+|-]#, #访问时间
#: [#,#+1)
eg:-atime 6
+#: [#+1,∞]
-#: [0,#)
-mtime #修改时间[内容被修改]
-ctime #文件属性,权限被修改
以“分钟”为单位:
-amin
-mmin
-cmin
#查找7天内修改过的文件,且属主不属于root,postfix
find /var -mtime -7 -not \( -user root -o -user postfix \) = find /var -ctime -7 -not -user root -a -not -user postfix
#权限查找
find -perm /666 -ls #/表示并集,u/g/o其中只要能1位匹配即可,或关系
+666 `/等于+号`
find -perm -666 #表交集,u/g/o必须同时拥有指定权限,与关系
find -perm 666 #精确匹配,匹配权限模式恰好是666的文件
#处理动作,参数过多问题
-print:默认的处理动作,显示至屏幕
-ls:类似于对查找到的文件执行“ls -l”命令
-delete:删除查找到的文件
-fls file:查找到的所有文件的长格式信息保存至指定文件中
-ok COMMAND {} \; #对查找到的每个文件执行由COMMAND指定的命令,对于每个文件执行命令之前,都会交互式要求用户确
-exec COMMAND {} \; #对查找到的每个文件执行由COMMAND指定的命令
{}: #用于引用查找到的文件名称自身
eg:touch f1{1..999999} #当给命令传递过多的参数时,命令会报错提示参数过多
#参数替换
xargs #很多命令不支持管道|来传递参数
echo f{1..999999} |xargs -n2 echo #n表示传递参数个数
find ./ -name '*.txt' -type f -print0 |xargs -0 cat
扩展:xargs与exec的区别
#find -exec命令会对每个匹配的文件,执行1个单独的rm操作,如果有n个进程,那么会启动n个进程,消耗系统性能.
find ./ -name "acc*.log" -type f -exec rm {} \;
#find xargs命令会对上个命令的标准输出,作为参数传给下个命令.
find ./ -name "acc*.log" -type f |xargs rm
`默认情况下, find 每输出一个文件名, 后面都会接着输出一个换行符 ('\n'),因此我们看到的 find 的输出都是一行一行的,xargs 默认是以空白字符 (空格, TAB, 换行符) 来分割记录的,因此文件名 ./"f f.txt" 被解释成了两个记录 ./f 和 f.txt, cat找不到这两个文件,所以报错,为了解决此类问题,让 find 在打印出一个文件名之后接着输出一个 NULL 字符 (''),而不是换行符, 然后再告诉 xargs 也用 NULL 字符来作为记录的分隔符,即 find -print0 和 xargs -0 ,这样就能处理特殊文件名了。`