Chinaunix首页 | 论坛 | 博客
  • 博客访问: 50510
  • 博文数量: 15
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 125
  • 用 户 组: 普通用户
  • 注册时间: 2015-07-28 15:48
文章分类

全部博文(15)

文章存档

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 ,这样就能处理特殊文件名了。`

阅读(1109) | 评论(0) | 转发(0) |
0

上一篇:linux文件打包与压缩

下一篇:sed基础

给主人留下些什么吧!~~