- 文件查找
- locate;
- 1、非实时,模糊匹配,查找是根据全系统文件数据库进行的;
- 2、# updatedb, 手动生成文件数据库
- 3、优势:速度快
- find;
- 1、实时查找
- 2、精确
- 3、支持众多查找标准
- 4、遍历指定目录中的所有文件完全查找,速度慢;
- find 查找路径 、 查找标准 、查找以后的处理运作
- 查找路径:默认为当前目录
- 查找标准:默认为指定路径下的所有文件
- 处理运作:默认为显示
- 匹配标准;
- -name ‘FILENAME’:对文件名做精确查找
- 文件名通配;
- ×:任意长度的任意字符。
- 例如;find /etc -name passwd*
- 可以查找到/etc/passwd文件中的passwd开头后面跟着任意字符串的文件。
- 结果出现的形式如: /etc/passwd.OLD /etc/pam.d/passwd /etc/passwd- /etc/passwd
- ?:匹配任意单个字符
- 例如:1、find /etc -name ?passwd
- 可以查找到/etc/passwd文件中的passwd开头为任意一个字符的文件。
- 结果出现的形式如:/etc/security/opasswd
- 2、find /etc -name passwd?
- 可以查找到/etc/passwd文件中的passwd结尾为任意一个字符的文件。
- 结果出现的形式如:/etc/passwd-
- []:匹配指定范围内的任意单个字符。
- 例如:find /etc -name [a-z]passwd
- 可以查找/etc/passwd文件中的passwd开头为任意一个小写字母的文件
- 结果出现的形式如:/etc/security/opasswd
- -iname 'FILENAME':文件名匹配时不区分大小写
- 例如: 查找目录a下的文件是w ,W.(先在目录a下面创建一个文件w,W)
- find /a -iname w
- 查找结果如:/a/W /a/w
- -user USERNAME:根据属主查找
- 例如:查找tmp下的属主为student的文件
- find /tmp -user student
- 查找结果如:/tmp/passwd /tmp/root.inittab.2
- -group GROUPNAME:根据属组查找
- 例如:查找tmp下的属组为student的文件
- find /tmp -group student
- 查找结果如:/tmp/passwd /tmp/root.inittab.2
- -uid UID :根据UID查找
- 例如:find /tmp -uid n(是UID)
- -gid GID : 根据GID查找
- 例如:find /tmp -gid n(是GID)
- -nouser:查找没有属主的文件
- 例如:find /etc -nouser
- -nogroup:查找没有属组的文件
- 例如:find /etc -nogroup
- -type
- f: 普通文件
- 例如: find /tmp/ -type f
- d: 目录文件
- 例如:find /etc/ -type d
- c:字符设备文件
- l:符号链接文件
- p:命令管道文件
- s:套接字文件
- -regex PATTERN:基于正则表达式进行文件名匹配
- -size 根据大小查找(默认单位为字节)
- [ +|-] #k 例如 +10k就是大于10k
- -10k就是小于10k
- 例如 :find /etc -size 10k
- 查找10k的认为小于1k以内的都为1k(如:9.1K、9.8K都算)
- #M(同#K)
- #G(同#G)_
- 组合条件:
- -a: 与(其次)
- 例如:查找一个不是目录文件但是是普通文件
- find /tmp -not -type d -a -type f
- -o: 或
- 例如:查找目录/tmp下目录文件或是普通文件
- find /tmp -type d -o -type f
- -not: 非(优先级最高)
- 例如:查找非目录文件
- find /tmp -not -type d
- -mtime :被修改的时间(单位:天)
- 例如:查找5天之内修改过的文件
- find /tmp -mtime -5
- -ctime :改变的时间 (单位:天)
- 例如:查找5天前给变过的文件
- find /tmp -ctime +5
- -atime :访问的时间(单位:天)
- 例如:查找30天之内访问过的文件
- find /tmp -atime -30
- [+|-]# :+ 指至少5天没访问过
- - 指5天之内曾经访问过
- -mmin:被修改时间 (单位是分钟)
- -cmin:改变时间
- -amin:访问时间
- 例如: 查找5分钟之内访问过的文件
- find ./ -amin -5
- -perm MODE :根据文件权限来查找
- /MODE: 任意一位匹配既满足条件
- 例如:查看当前目录下只要有一位权限匹配的就行
- find ./ -perm /644
- -MODE: 精确匹配 。文件权限能够完全包含此MODE才符合条件。例如查找其他用户有执行权限的 。
- 例如:查找当前目录下权限为rw_r__r__(属主为读写不执行、属组为读不写不执行、其它为读不写不执行)的文件
- find ./ -perm -644(644是指rw_r__r__ )
- 【当你用此命令的时候发现有很多文件,但是当你用ls 查看时文件并不是你想想的那么多,这时候你就会怀疑此
- 命令是错误的,不要怀疑,因为有很多符合的隐藏文件也显示了出来。你可以用ls -l -a的命令查看就知道了。】
- 运动:
- -print:显示(默认)
- -ls;类似ls -l的形式显示每一个文件的详细
- -ok COMMAND {}(大括号文件名称占位符) \;(结尾必须是\;):每一次操作都需要确认
- 例如:找到类型是目录的文件把它的属主属组都改为能执行的权限;
- find ./ -type d -ok chmod +x {} \;
- 【每一个更改的权限的文件它都会提示一下是否要更改。回答y就会更改(如:< chmod ... ./ > ?)。】
- -exec COMMAND {} \;不需要确认
- 例如:找到当前目录下只要其它用户有读写权限,并且将其改为读权限
- find ./ -perm -006 -exec chmod o-w {} \;
- 例如:把权限是020的文件名字改为原来名字.new
- find ./ -perm -020 -exec mv {} {}.new \;
- -xargs:从标准输入接受进来命令并执行
- 例如:在目录etc下的大于1M的文件追加到/tmp/etc.largefiles中去
- 1.用—exec写:find /etc -size +1M -exec echo {} >> /tmp/etc.largefiles \;
- 2.用-xargs写:find /etc -size +1M | xargs echo {} >> /tmp/etc.largefiles
- 【然后用cat /tmp/etc.largefiles查看。记号:用-xargs显示的结果可不像用-exec显示的结果
- -xargs显示的结果是不是一个一行,而是中间用空格隔开的一行文本。】
- 特殊权限
- passwd : s【passwd有个特殊权限是s】
- SUID:运行某程序时,相应进程的属主程序文件自身的属主,而不是启动者
- chmod u+s FILE
- chmod u-s FILE
- 如果FILE本身原来就有执行权限,则SUID显示为s,否则显示S
- 例如:我们开始时用# ls -l /bin/cat时显示
- -rwxr-xr-x 1 root root 23260 May 11 2011 /bin/cat
- 我们再用# ls -l /etc/shadow查看是显示
- -r-------- 1 root root 1154 Feb 27 17:48 /etc/shadow
- 我们再用其它用户$ cat /etc/shadow切进去看看,发现无法查看,显示【没有权限】
- cat: /etc/shadow: Permission denied
- 解决方案: 如果我们用chmod u+s /bin/cat时,我们再用ls -l /bin/cat查看,
- -rwsr-xr-x 1 root root 23260 May 11 2011 /bin/cat
- 【我们发现第一次查看的跟这一次有不同地方,不同地方在属主的执行权限上,原来的x变成了s,让用户有了管理员的权限。有什么改变继续往下看】
- 有很多人又用ls -l /etc/shadow查看显示的和第一次查看的权限一样,就认为失败了。不是这样的,我们可以在切换用户
- 去看看,$ cat /etc/shadow 这时候,我们发现已经可以查看/etc/shadow文件了
- SGID:运行某程序时,相应进程的属组程序文件自身的属组,而不是启动者所属的基本组
- chmod g+s FILE
- chmod g-s FILE
- 例如: 有一个开发小组 develop team中有三个用户分别是hadoop ,hbase,hive
- 我们期望这三个用户在/etc/project/目录下都能创建文件创建,这三个用户创建的是一个项目,所以其中一个人写的文件其它两个人也可以看到
- 也可以编辑,怎么实现?
- 思考:这里我们可以让这三个用户属于同一个基本组,不能是附加组,为什么?
- 因为每个用户创建的文件的属主是自己,属组就是基本组而不是附加组。所以我们让组有写权限,并不意味着别人都能写。
- 我们可以这样说hadoop的基本组是hadoop,创建了一个附加组是develop,而hadoop用户在这里创建的任何一个文件其属主都是hadoop,属组是hadoop,
- 而不是develop组。(更何况用户创建的文件属组也未必有写权限)
- 解决方案:1、首先加一个组是developteam , groupadd developteam
- 2、然后把目录/etc/project的属组改为developteam, chown -R :developteam /etc/project
- 3、让后把三个用户的附加组都改为developteam这个组 usermod -a -G developteam hadoop/hbase/hive 【不确定还可以验证一下 id hadoop/hbase/hive】
- 4、查看当前目录 ls -ld 显示 :drwxr-xr-x 2 root developteam 4096 Feb 27 21:03 . 【可以看出属组没有写权限,属主是root,hadoop是不能在这里创建文件】
- 5、让属组有写权限 chmod g+w /etc/project
- 6、切换到project里面,然后创建(touch a.A)一个文件a.A: -rw-rw-r-- 1 hadoop hadoop 0 Feb 27 21:22 a.A 从这里可以看出已经有了写权限
- 7、设置一个GID权限 chmod g+s /etc/project 然后在查看(ls -ld /etc/project)一下
- drwxrwsr-x 2 root developteam 4096 Feb 27 21:22 /etc/project【可以看到属组上的执行权限已经变成s了】
- 8、然后用三个用户分别创建,而最后的的属组就是developteam
- Sticky:在一个公共目录,每个人都能创建文件,删除自己的文件,但不能删除别人的文件
- chmod o+t DIR
- chmod o-t DIR
- 可以这样设置chmod o+t /etc/project
- 然后查看drwxrwsr-t 2 root developteam 4096 Feb 27 21:22 /etc/project
- 这样每个人只能删除自己的目录,而不能删除别人的目录了。
- find练习题:
- 1、查找/var目录下属主为root并且属组为mail的所有文件;
- find /var -user root -group mail
- 2、查找/usr目录下不属于root,bin,或student的文件;
- find /usr -not -user root -a -not -user bin -a -not -user student
- find /usr -not \( -user root -o -user bin -o -user student \)
- 3、查找/etc目录下最近一周内内容修改过且不属于root及student用户的文件;
- find /etc -mtime -7 -not \ ( -user root -o -user student \)
- find /etc -mtime -7 -not -user root -a -not -user student
- 4、查找当前系统上没有属主或属组且最近1天内曾被访问过的文件,并将其属主属组均修改为root;
- find / \( -nouser -o -nogroup \) -a -atime -1 -exec chown root:root {} \;
- 5、查找/etc目录下大于1M的文件,并将其文件名写入/tmp/etc.largefiles文件中;
- find /etc -size +1M >> /tmp/etc.largefiles
- 6、查找/etc目录下所有用户都没有写权限的文件,显示出其详细信息;
- find /etc -not -perm /222 -ls
转载于:https://blog.51cto.com/lzysg172/1151156