1、了解find的含义
find:
实时查找
精确
支持众多查找标准
遍历指定目录中的所有文件查找,速度慢;
find 查找路径 查找标准 查找到以后的处理动作
查找路径:默认为当前目录(查找路径可省略)
查找标准: 默认为指定路径下的所有文件
处理运作:默认为显示
2、find的匹配标准:
-name'FILENAME':对文件名作精确匹配
eg:find /etc -name'passwd'
文件名通配:
* :任意长度的任意字符
?:匹配其前的字符可有可无
[]:匹配指定范围内的任意单个字符
eg:find /etc -name'passwd*' 查找以passwd开头的文件
eg:find /etc -name'*passwd' 查找以passwd结尾的文件
eg:find /etc -name'*passwd*' 查找包含passwd字符串的文件
-iname 'FILENAME': 文件名匹配时不区分大小写
-regex PATTERN : 基于正则表达式进行文件匹配
-user USERNAME : 根据属主查找
eg:find /tmp -user student
-group GROUPNAME: 根据属组查找
-uid UID:根据UID查找
eg:find /tmp -uid 2003
-gid GID:根据GID查找
-nouser : 查找没有属主的文件
-nogroup : 查找没有属组的文件
-type(根据文件类型查找)
f: 普通文件
d: 目录
c:字符设备
b:块设备
l: 链接文件
p: 管道设备
s: 套接字设备
eg:find /tmp -type s
-size[+|-](根据文件大小查找)
#k: (默认单位是字节)
eg:+10k 意思是大于10k -10k 意思是小于10k
#M
eg:find /etc -size 1M 找到etc下大小为1M的文件(所有小于1M的也会显示)
eg:find /etc -size 10k -ls 可显示出文件的大小
#G
3、find的组合条件
-a:与逻辑,要求两个条件同时满足才显示
eg:find /tmp -nouser -a -type d 查找tmp文件下没有属主并且没有目录的文件
eg:find /tmp -nouser -a -type d -ls 查找tmp文件下没有属主并且没有目录的文件个数
-o:或逻辑,满足一个条件即可
eg:find /tmp -nouser -a -type d 查找tmp文件下没有属主或者没有目录的文件
-not:非目录类型的文件
eg:find /tmp -not -type d 查找tmp文件下非目录类型的文件
eg:find ./ -not -user user1 -o -not -type d 查找当前文件下属主不是user1或空目录的文件
eg:find ./ -not \(user user1 -o -not -type d \) 查找当前文件下属主不是user1或空目录的文件
/tmp目录,不是目录,并且还不能套接字类型的文件
/tmp/test目录下,属主不是user1,也不是user2的文件
find /test -not -user user1 -a -not -user user2
find /test -not \ ( -user user1 -o -user -user2 \)
4、根据文件的时间戳查找
-mtime [+|-]#:修改了的时间(单位为天)
-ctime [+|-]#:改变的时间
-atime [+|-]#: 访问的时间
eg:-atime 5 ; 离现在刚好在5天访问
-atime +5; 至少5天没访问了
-atime -5; 最近5天内访问了
-mmin [+|-] #: 修改了的时间(单位为分钟)
-cmin [+|-] #;改变的时间
-amin [+|-] #: 访问的时间
eg:find ./ -amin -5 最近5分钟之内访问过的文件
eg:find ./ -amin +5 离现在5分钟之前访问过的文件
eg:find ./ -amin 5 离现在刚好5分钟的那一刻访问过的文件
eg:find /tmp -atime +7 离现在至少7天未访问过的文件
eg:find /tmp -atime +30 离现在至少一个月未访问过的文件
-perm MODE:精确匹配(根据文件权限查找)
/MODE:任意一位匹配即满足条件
eg:find ./ -perm 644 查找当前文件下为644的文件(直接跟权限作精确匹配)
eg:find ./ -perm /644 只要有一位匹配即可(644意为属主是读写644:rw-r--r--)
-MODE: 文件权限能完全包含此MODE时才符合条件
eg:find ./ -perm -001 查找其它用户有执行权限
eg:find ./ -perm -022 组有写权限,其他人也有写权限
eg:find ./ -perm /022 组有写权限,或其他人有写权限
eg: find ./ -perm -007 其他用户能读能写能执行
动作:
-print:显示
-ls:类似ls-l的形式显示每一个文件的详细
-ok COMMAND {} \; :每一次操作都需要用户确认
eg:find ./ -type d -ok chmod +x {} \; 让他的属主属组都能够执行权限
-exec COMMAND {} \; :
eg:find ./ -perm -006 -exec chmod o-w {} \; 把其他用户的写权限去掉
eg:find ./ -perm -020 -exec mv {} {}.new \; 查找到属组有写权限的文件,把他原来的文件名后面加上.new
只要引用文件的文件名就使用{}
找到目录下文件名是以.sh结尾的,所有用户都具有执行权限,把其他用户的权限去掉
find ./ -name"*.sh" -a -perm -111 -exec chmod o-x {} \;
xargs 从标准输入接收进来命令并执行
eg:find /etc/ -size +1M | xargs echo {} >> /tmp/etc.largefiles
5、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、特殊权限
passwd:s
SUID:运行某程序时,相应进程的属主是程序文件自身的属主,而不是启动者;
chmod u+s FILE
chmod u-s FILE
如果FILE本身原来就有执行权限,则SUID显示为s,否则显示为S
SGID:运行某程序时,相应进程的属组是程序文件自身的属组,而不是启动者所属的基本组;
chmod g+s FILE : 加上这个位
chmod g-s FILE : 减去这个位
develop team,hadoop,hbase,hive
/tmp/project/
develop
Sticky:在一个公共目录,每个都可以创建文件,删除自己的文件,但不能删除别人的文件;
chmod o+t DIR
chmod o-t DIR
000:表示没有SUID、SGID、Sticky
001:表示没有SUID、SGID 有Sticky
...
110:表示有SUID、SGID 没有Sticky
111:表示有SUID、SGID、Sticky
chmod 1755 /backup/test 表示此文件是Sticky755的文件
chmod 3755 /backup/test 表示此文件是SGID、Sticky755的文件
7、find的高级实例
写一个脚本,显示当前系统上shell为-s指定类型的用户,并统计其用户总数。
-s选项后面跟的参数必须是/etc/shells文件中存在的shell类型,否则不执行
此脚本。另外,此脚本还可以接受--help选项,以显示帮助信息。脚本执行形
如:./showshells.sh -s bash
显示结果形如:
BASH,3users,they are:
root,redhat,gentoo
脚本内容:
#!/bin/bash
#
if [ $1 == '-s' ]; then (如果参数1等于-s)
! grep "${2}$" /etc/shells &> /dev/null && echo "Invalid shell." && exit 7 ( 如果!grep "${2}$" /etc/shells 执行结果为真则继续执行 echo "Invalid shell.",否则停止执行结果把其内容追加到/dev/null中)
elif [ $1 == '--help' ];then (如果参数1等于--help)
echo "Usage: showshells.sh -s SHELL | --help"(显示参数1执行后的结果)
exit 0
else
echo "Unknown Options." (显示未知用户的项)
exit 8
fi
NUMOFUSER=`grep "${2}$" /etc/passwd | wc -l` (显示用户总数)
SHELLUSERS=`grep "${2}$" /etc/passwd | cut -d: -f1` (显示符合条件的用户)
SHELLUSERS=`echo $SHELLUSERS | sed 's@[[:space:]]@,@g'`( 显示shell用户并把各个用户数之间的空格换成",")
echo -e "$2, $NUMOFUSER users, they are: \n$SHELLUSERS" (显示最终的格式 )
转载于:https://blog.51cto.com/6644068/1151120