1.1. find查找

1.1.1. 功能

搜索文件目录层次结构

1.1.2. 格式:

find path -option actions

1.1.3. 常用选项:

-name 文件名,支持(‘*’, ‘?’)
-type 文件类型,d 目录,f 常规文件等
-perm 符合权限的文件,比如 755
-atime -/+n 在 n 天以内/过去 n 天被访问过
-ctime -/+n 在 n 天以内/过去 n 天被修改过
-amin -/+n 在 n 天以内/过去 n 分钟被访问过
-cmin -/+n 在 n 天以内/过去 n 分钟被修改过
-size -/+n 文件大小小于/大于,b、k、M、G
-maxdepth levels 目录层次显示的最大深度
-regex pattern 文件名匹配正则表达式模式
-inum 通过 inode 编号查找文件
动作:
-detele 删除文件
-exec command {} \; 执行命令,花括号代表当前文件
-ls 列出当前文件,ls -dils 格式
-print 完整的文件名并添加一个回车换行符
-print0 打印完整的文件名并不添加一个回车换行符
-printf format 打印格式
其他字符:
! 取反
-or/-o 逻辑或
-and 逻辑和

1.1.4. 示例:

查找文件名:
# find / -name "*http*"
查找文件名并且文件类型:
# find /tmp -name core -type f -print
查找文件名并且文件类型删除:
# find /tmp -name core -type f -delete
查找当前目录常规文件并查看文件类型:
# find . -type f -exec file '{}' \;
查找文件权限是 664:
# find . -perm 664
查找大于 1024k 的文件:
# find . -size -1024k
查找 3 天内修改的文件:
# find /bin -ctime -3
查找 3 分钟前修改的文件:
# find /bin -cmin +3
排除多个类型的文件:
# find . ! -name "*.sql" ! -name "*.txt"
或条件查找多个类型的文件:
# find . -name '*.sh' -o -name '*.bak'
# find . -regex ".*\.sh\|.*\.bak"
# find . -regex ".*\.\(sh\|bak\)"
并且条件查找文件:
# find . -name "*.sql" -a -size +1024k
只显示第一级目录:
# find /etc -type d -maxdepth 1
通过 inode 编号删除文件:
# rm `find . -inum 671915`
# find . -inum 8651577 -exec rm -i {} \;


下列命令可以将10天前的 .txt文件复制到OLD目录中:
$ find . -type f -mtime +10 -name "*.txt" -exec cp {} OLD \;


find 命令的 -delete 选项可以删除所匹配到的文件。下面的命令能够从当前目录中删
除.swp文件:
$ find . -type f -name "*.swp" -delete
# linux文件无创建时间
# Access 使用时间
# Modify 内容修改时间
# Change 状态改变时间(权限、属主)
# 时间默认以24小时为单位,当前时间到向前24小时为0天,向前48-72小时为2天
# -and 且 匹配两个条件 参数可以确定时间范围 -mtime +2 -and -mtime -4
# -or 或 匹配任意一个条件

find /etc -name "*http*"     # 按文件名查找
find . -type f               # 查找当前目录下的所有普通文件
find / -perm                 # 按照文件权限查找
find / -user                 # 按照文件属主
查找
find / -group                # 按照文件所属的组来查找文件
find / -atime -n             # 文件使用时间在N天以内
find / -atime +n             # 文件使用时间在N天以前
find / -mtime +n             # 文件内容改变时间在N天以前
find / -ctime +n             # 文件状态改变时间在N天前
find / -mmin +30             # 按分钟查找内容改变
find ./ -size +10M           #查找当前目录下大于10MB的文档
find ./ -size +1M -exec ls -l {} \;    #查找打印1MB的文件后列出文件的详细信息
find / -size +1000000c -print                           # 查找文件长度大于1M字节的文件
find /etc -name "*passwd*" -exec grep "xuesong" {} \;   # 按名字查找文件传递给-exec后命令
find . -name 't*' -exec basename {} \;                  # 查找文件名,不取路径
find . -type f -name "err*" -exec  rename err ERR {} \; # 批量改名(查找err 替换为 ERR {}文件
find 路径 -name *name1* -or -name *name2*               # 查找任意一个关键字
find /var/adm -mtime +3 -print                          #为了在/var/adm目录下查找更改时间在3日以前的文件
find . -newer age.awk ! -newer belts.awk -exec ls -l {} \; #查找更改时间呗文件age.awk新但比文件belts.awk旧的文件
find /etc -type d -print                                #查找/etc目录下所有的目录
find /etc ! -type d -print                              #查找/etc下除了目录之外的所有类型的文件
find /etc -type l -print                                #查找/etc下所有的符号链接文件

1.1.5. 常用示例

1)在系统根目录下,查找文件类型为普通文件,属于ixdba用户,两天以前,并且查找时不包含/usr/bin目录的文件名为main.c的文件,并将结果输出到屏幕。

[root@mylinux~]#find / -path "/usr/bin" -prune -o -name "main.c"  -user ixdba -type f -mtime  +2  -print

2)对上例中搜索的结果进行删除操作。

[root@mylinux~]#find / -path "/usr/bin" -prune -o -name "main.c"  -user ixdba -type f
    -mtime  +2  –print -exec  rm  {}  \;

3)在系统根目录下查找不在/var/log和/usr/bin目录下的所有普通文件。

[root@mylinux~]#find /  \( -path /var/log –o –path /usr/bin \) –prune –o –name
   "main.c"–print

\ 表示引用,告诉shell不对后面的字符做特殊解释,而留给find命令去解释其意义。

注意

“\(-path”中,在“(”和“-path”之间是有空格的,同时“/usr/bin\)”在“bin”和“\”之间也是有空格的。

4)查找系统中所有大小为0的普通文件,并列出它们的完整路径。

[root@mylinux~]#find / -type f –size 0 –exec ls –al {} \;

5)查找系统/var/logs目录中修改时间在7天以前的普通文件,然后以交互方式删除。

[root@mylinux~]#find /var/log –type f –mtime +7 –ok rm {} \;
<rm ... /var/log/spooler.1 > ? y
<rm ... /var/log/spooler.3 > ? y
<rm ... /var/log/boot.log.2 > ? y
<rm ... /var/log/spooler.4 > ? y
在当前目录及子目录下查找所有“*.txt”文件。

[root@mylinux~]#find .–name "*.txt"–print

6)在用户自己的根目录下查找文件名以一个大写字母开头,紧接着是一个小写字母和两个数字,最后以“.txt”结尾的文件。

[root@mylinux~]$ find ~  -name “[A-Z][a-z][0--9][0--9]*.txt” -print

7)在/etc目录下查找文件属主为ixdba用户的文件。

[root@mylinux~]#find /etc –user ixdba -print