学习笔记整理——Find,find -perm


-iname 忽略大小写

-name 后面养成加双引号的习惯

-inum 查找inode


Find
语法: find [路径] [参数]  如果不输入路径,查询当前目录

小技巧Tips
  1. 在使用 -maxdepth 参数的时候,如果有多个选项,把 maxdepth 放到路径的后面,其他参数的前面,否则可能会出错。
  2. -name 后面养成习惯加双引号,避免出错
  3. 如果不指定文件的具体路径,可以写根目录 / ,扩大搜索范围。比如在搜索一个 inode 号的时候,毫无头绪,就可以使用根目录
  4. find 可以和正则表达式匹配一起使用 !取反,*通配符

参数
-name  文件名字
-iname 忽略文件名的大小写,匹配所有大小写字母
-type  f文件,d目录,l连接文件,b块设备,c串行端口设备
-size  通过文件大小查找
-inum  查找 inode 
-user  指定属主,也可以使用 uid
-group 指定用户组,也可以使用 gid

-*time mtime 创建或更改时间;atime 访问时间;ctime文件inode号被修改,
-*min  mmin ±n,大于小于 n 分钟
-mtime +365 创建或更改时间,大于365天的
-mtime -10  创建或更改时间,小于10天
-atime +365 访问或读取时间,大于365天
-atime -10  访问或读取时间,小于10天

-o    或者
-a    并且
-not  查找不满足条件的文件,用在特定的条件之前

-mindepth 指定目录的开始深度
-mindepth 0 不限制
-mindepth 1 从当前目录及其内容开始
/tmp/link/a/1
/tmp/2.txt
/tmp/2
-mindepth 2 从一级子目录内容开始,当前目录的文件和目录不再范围内
/tmp/link/3
/tmp/link/a/2

-maxdepth 指定目录的最大深度
-maxdepth 0
-maxdepth 1 只查目录本身及其内部文件,包括一级目录本身
/tmp/2
/tmp/3
-maxdepth 2 目录内的文件,包括目录下的一级子目录及其文件
/tmp/link/2
/tmp/link/3
/tmp/2.txt
/tmp/harda
/tmp/2

-perm 指定文件权限 
-perm  mode,匹配项必须严格匹配此权限
-perm -mode,匹配项必须不少于此权限。匹配大于此权限的文件
-perm /mode,匹配项中 任何一组包含要求权限中的任意一个 就可以,仅限于普通权限,相对于单独的 rwx 里面的任意一个权限,并非 user group others 654里面的 6 5 4 任意权限。如果权限使 644,转换为二进制 110 100 100, 那么找到的文件只需匹配到任意一个 1 即可,即 user 可读或可写、group 可读或可写、other 可读或可写,均可以匹配。
-perm /mode(四位),和3位的数字权限规则一致,区别在于特殊权限和普通权限独立思考
-perm +mode,功能和/一样,

-path "..." -prune -o [其他参数] -print
     ... 代表排除指定的文件或者目录,其他均为固定写法。注意,如果在排除目录的时候,最后面不能有/符号,√ "/tmp/123"  ×"/tmp/123/"。

-empty   空文件,空目录,
-false   总是出错的文件
-fstype  指定文件类型查找,ext3 ext4


Find练习题
1.查找 /tmp 目录下名字为 aming开头的所有文件。
find /tmp -name "aming*"
  注意这里并不能使用 ^aming

2.查找指定 inode 的文件或目录
find / -inum 141418

3.找出 tmp 目录下的所有一级子目录
find /tmp -maxdepth 1 -type d
  在root目录下及其最大两层深度的子目录中,查找 passwd 文件
find /root -maxdepth 3 -name passwd
  在第二层和第四层子目录之间查找 passwd 文件
find . -mindepth 3 -maxdepth 5 -name passwd

4.搜索tmp目录下所属组group1,所属主user1的文件
find /tmp -type f -user user1 -group group1


5.搜索根目录下的 1.txt 2.txt 和 a 目录
  find / -name 1.txt -o -name 2.txt -o -type d -name a

6. 搜索tmp目录下以 a 开头并且以 c 结尾的文件
   find /tmp -name "a*" -a -name "*c" -type f

7. 搜索 tmp 目录下,不是以 a 开头,并且大小超过100M的文件
   find /tmp -not -name "a*" -a -name "*txt" -size +100M -tyep f

8. 搜索 tmp 目录下,修改时间一年内的文件
   find . -type f  -mtime -365

9. 搜索目录下,修改时间一年内,不是文件的其他类型
   find . -not -type f -mtime -365

10.搜索目录下,修改时间超过一年的并且大于100M的文件
   find . -type f -not -mtime -365 -a -size +100M

11.列出tmp目录下一年内都没有改变的文件
   find /tmp -type f ! -mtime -365

12.找出 tmp 目录下的所有的一级空目录
find . -type d -empty

13.搜索tmp目录下名称包含“*.txt"的目录,或者包含"*.txt"并且权限为777的文件或目录
find /tmp -name *.txt -a \( -perm 777 -o -type d \)
-a and意思

14.查找所有的隐藏目录
find . -type d -name ".*"

15.搜索当前目录下10天以前的文件,或者权限为644的的文件和目录
find . -type f -mtime +10 -o -perm 644

16.在 / 目录下的 etc目录及其子目录下查找 passwd 文件
find /etc -name passwd
find / -path -path "/etc*" -name passwd
/etc/passwd
/etc/pam.d/passwd
 
在根目录下的 etc 以及 tmp 目录内查找 passwd 文件
cp /etc/passwd /tmp
find / \( -path "/etc*" -o -path "/tmp*" \) -name passwd

在所有名为 general 的目录下查找 .stp 结尾的文件
find / -path "*/general/*" -name "*.stp"

 
找到 usr 目录下,并且在 applications 子目录里面以 .cache 结尾的文件。假设并不知道 applications 的绝对路径,并且目录是第 10 层甚至第 100 层目录,只知道绝对路径以 /usr/local 开头
方法一:
find /usr/local -name applications -type d 
在用上面找到的绝对路径去执行 find ....... -name "*.cache"
方法二: 
find /usr/local -path "*share*" -name "*.cache" 

NOTE: -path ".." ,表示 path 路径里面包含指定的字符。

17.查找除 /etc 目录及其子目录下的,仍在根目录的 passwd 文件
find / -path "/etc" -prune -o -name passwd -print

查找/tmp/ 目录下所有文件(不包含目录), 并且不包含目录123
find /tmp/ -path "/tmp/123" -prune -o -type f -print
-print -path -prune -o 固定格式,一个都不能少 ,表示排除指定的目录或文件

查找/tmp/ 目录下所有文件(不包含目录), 并且不包含目录123和目录234和目录345
find /tmp/ \( -path "/tmp/123" -o -path "/tmp/234" -o -path "/tmp/345" \) -prune -o -type f -print
注意,如果是查找目录时,-path 后面的目录名一定不要带/ 如 写成 -path "/tmp/123/" 就错了,而查找文件时,带/ 没有问题。

18.删除tmp目录下所有文件
find /tmp/ -type f |xargs rm

19.查找类型为 ext4 的文件
find . -fstype ext4

20.查找tmp目录下包含abcde字母的文件,不区分大小
find /tmp -iname abcde

使用find重命名文件
21.用inode 16187430 编号重命名为 newtest
find -inum 16187430 -exec mv {} new-test-file-name \;
22.给tmp目录下的所有文件增加.bak后缀
find /tmp/ -type f |xargs -i {} {}.bak
-i 把签名列出的文件一个个的处理
{} 表示一次一个对象,比如find出来很多行,每次处理一行,用{}代表这一行

23.找到具有组读权限的文件和目录
find . -perm -g=r  -exec ls -l {} \;
 -g=r 会模糊匹配,只要含有 r 权限的都会列出来

24.找到具有组读权限和写权限的文件和目录
find . -perm -g=r -a -perm -g=w -type f 

25.搜索具有用户读写可执行权限的目录
find . -perm -u=r -a -perm -u=w -a -perm -u=x -type f

26.找到对组用户具有只读权限的文件,
find -perm g=r -exec ls -l {} \;
----r----- 1 root root 0 3月  31 21:50 ./1
find -perm 040 -exec ls -l {} \;

27.列出/etc目录及其子目录下的5个最大的文件。
find /etc  -exec ls -s {} \; | sort -n -r | head -5

28.列出 /etc 目录及其子目录下5个最小的文件
find /etc -type f -exec ls -s {} \; | sort -n  | head -5

29.列出 /etc 目录及其子目录下5个最小的文件,不包含 0 空文件
find /etc -not -empty -type f -exec ls -s {} \; | sort -n  | head -5
find /etc ! -empty -type f -exec ls -s {} \; | sort -n  | head -5

30.find 命令删除大于100M的 .zip 文件
find / -type f -name "*.zip" -size +100M -exec rm -i {} \;

31.列出在1.txt修改之后修改的文件
find -newer 1.txt

32.列出在1.txt 和 test 之间修改的文件
find -newer 1.txt ! -newer test       该命令列出的文件,会包含 test 文件

33.列出在 2012.12.01 到 2012.12.31 修改的文件
思路,手动创建两个文件,文件目录无所谓,修改时间
touch -m -t 1212010000 1.txt
touch -m -t 1212322359 2.txt
find / -newer 1.txt ! -newer 2.txt


配合 alias,实际工作中可用
alias rmc="find . -iname core -exec rm {} \;"      删除c程序产生的core文件
alias rmao="find . -iname a.out -exec rm {} \;"
alias rm100m="find / -type f -name *.tar -size +100M -exec rm -i {} \;"
alias rm1g="find / -type f -name *.tar -size +1G -exec rm -i {} \;"
alias rm2g="find / -type f -name *.tar -size +2G -exec rm -i {} \;"
alias rm5g="find / -type f -name *.tar -size +5G -exec rm -i {} \;"



找到具有组读权限的文件find 工作中最常用的命令
find /path -type[f d]-mtime [+-n] -name "*log*" -size +100M |xargs rm -rf
find /path -type[f d]-mtime [+-n] -name "*name*" -size -100M -exec rm -rf {} \;
find . -type d -o \( -type f -mtime +7 \)




 
花了点时间才将linux中find命令的-perm参数弄懂,分享一下。

find -perm,根据文件的权限来查找文件,有三种形式:
find -perm mode
find -perm -mode
find -perm +mode
那么这三者之间有什么区别呢?解释之前首先得简单说一下linux中文件权限位的概念。在linux中文件或目录有三者权限r,w,x,代表的含义分别是读、写、可执行。而一个文件或目录的属性中又包括所属用户u、所属组g、其他o三个部分的属性,分别表示所属用户、所属组、其他用户对这个文件所拥有的权限。看起来大概是这个样子:
所属用户 所属组 其他
  rwx rwx rwx
用户在其拥有权限的位上设置1,没有权限的位设置0。如果将每个部分的这些权限位看成二进制数,每个部分可以用3位二进制数表示,最大值为7(2^3-1),表示可读、可写、可执行。严格的来说,文件权限除了r、w、x以外还有setuid,setgid权限,等下再解释。

好了,有了权限位的基础,那么再来看find -perm mode。mode是三个数字表示的,每个数字最大值是7(原因前面解释过了)。
find -perm mode , 表示严格匹配,也就是你的文件权限位转换成对应的十进制数字与mode一模一样,那么匹配成功,需要注意的是如果mode给的数字不足3位,那么前面自动添0(严格的说是不足4位,原因就是前面所说的setuid,setgid,稍后解释)

find -perm -mode , 表示mode中转换成二进制的1在文件权限位里面必须匹配,比如mode=644那么转换成二进制为110 100 100,而被查找的文件的权限位也可以被转换成一个二进制数,两者在位上为1的部分必须完全匹配,而0则不管。例如被查找的文件的权限为转换成二进制数是111 111 111那么这个比如被匹配,而假如是100 100 100那么则不会匹配。所以这个'-'的作用归结起来就是匹配比mode权限更充足的文件(找不到什么词语来形容了)

find -perm +mode , 与 -mode的区别是+mode只需其中的任意一个1的部分被匹配,-mode是所有1的部分都必须被匹配,同样+mode也不管0位。

现在来解释setuid,setgid,setuid权限是用来使其他用户可以“越权”执行你的命令,而本质上的实现就是在权限检查的时候,在进程的的有效UID里面保存了这个其他用户的UID,所以权限得意验证通过(在这里的 注释1里面很简单的介绍了一下),这些权限用一个新的3位二进制数表示,有4,2,1三种值,4表示有setuid权限,2表示有setgid权限,1表示有粘着位(t)权限(粘着位权限最典型的例子是/tmp,每个用户可以在里面创建、更新、删除自己创建(文件所属用户是自己)的文件,而不能更改别人的文件)。

http://www.oschina.net/question/565065_77199





  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值