文件处理--find命令的用法

时间:2022-11-24 08:14:06

find命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。

一、命令格式:

find path -option [ -print ] [ -exec -ok command ] {} \;

-print      将查找到的文件输出到标准输出
-exec command {} \;      将查到的文件执行command操作,{} 和 \;之间有空格
-ok      和-exec相同,只不过在操作前要询用户

二、常用参数

=====================================================
-name filename      #查找名为filename的文件
-perm      #按执行权限来查找
-user username      #按文件属主来查找
-nouser      #查无有效属主的文件,即文件的属主在/etc/passwd中不存
-group groupname      #按组来查找
-nogroup      #查无有效属组的文件,即文件的属组在/etc/groups中不存在
-mtime -n +n      #按文件更改时间来查找文件,-n指n天以内,+n指n天以前
-atime -n +n      #按文件访问时间来查GIN: 0px”>

-ctime -n +n      #按文件创建时间来查找文件,-n指n天以内,+n指n天以前
-type b/d/c/p/l/f      #查是块设备、目录、字符设备、管道、符号链接、普通文件
-size n[c]      #查    长度为n块[或n字节]的文件
-depth      #使查找在进入子目录前先行查找完本目录

=====================================================

实例

1、根据文件或者正则表达式进行匹配

在当前目录及子目录中,查找大写字母开头的txt文件
find . -name '[A-Z]*.txt' -print

在当前目录及子目录中,查找不是out开头的txt文件
find . -name "out*" -prune -o -name "*.txt" -print

基于正则表达式匹配文件路径
find . -regex ".*\(\.txt|\.pdf\)$"

打印test文件名后,打印test文件的内容
find ./ -name test -print -exec cat {} \;

不打印test文件名,只打印test文件的内容
find ./ -name test -exec cat {} \;

2、根据文件类型搜索

find . -type 类型参数
类型参数列表:
f     普通文件
l      符号连接
d     目录
c     字符设备
b     块设备
s     套接字
p     Fifo

查找目录并列出目录下的文件(为找到的每一个目录单独执行ls命令,没有选项-print时文件列表前一行不会显示目录名称)
find ./ -type d -print -exec ls {} \;

3、根据文件时间戳进行搜索

UNIX/Linux文件系统每个文件都有三种时间戳:

访问时间(-atime/天,-amin/分钟):用户最近一次访问时间。
修改时间(-mtime/天,-mmin/分钟):文件最后一次修改时间。
变化时间(-ctime/天,-cmin/分钟):文件数据元(例如权限等)最后一次修改时间。

搜索最近七天内被访问过的所有文件
find . -type f -atime -7

搜索恰好在七天前被访问过的所有文件
find . -type f -atime 7

搜索超过七天内被访问过的所有文件

find . -type f -atime +7

4、根据文件大小进行匹配

文件大小单元:

b —— 块(512字节)
c —— 字节
w —— 字(2字节)
k —— 千字节
M —— 兆字节
G —— 吉字节

搜索大于10KB的文件
find . -type f -size +10k

搜索小于10KB的文件
find . -type f -size -10k

搜索等于10KB的文件
find . -type f -size 10k

5、根据文件权限/所有权进行匹配

当前目录下搜索出权限为777的文件
find . -type f -perm 777

找出当前目录下权限不是644的php文件
find . -type f -name "*.php" ! -perm 644

找出当前目录用户tom拥有的所有文件
find . -type f -user tom

找出当前目录用户组sunk拥有的所有文件
find . -type f -group sunk

6、其他例子

查找当前目录下所有.txt文件并把他们拼接起来写入到all.txt文件中
find . -type f -name "*.txt" -exec cat {} \;> all.txt

将30天前的.log文件移动到old目录中
find . -type f -mtime +30 -name "*.log" -exec cp {} old \;

在/ l o g s目录中查找更改时间在5日以前的文件并删除它们:
$ find /logs -type f -mtime +5 -exec -ok rm {} \;

在/tmp中查找所有的*.h,并在这些文件中查找“SYSCALL_VECTOR”,最后打印出所有包含”SYSCALL_VECTOR”的文件名
find /tmp -name "*.h" -exec grep "SYSCALL_VECTOR" {} \; -print

在当前目录,不再子目录中,查找txt文件
find . ! -name "." -type d -prune -o -type f -name "*.txt" -print

查找比aa.txt新的文件
find . -newer "aa.txt" -type f -print

查找aa.txt 并备份为aa.txt.bak
find . -name 'aa.txt' -exec cp {} {}.bak \;

查找aa.txt 归档压缩为aa.txt.tar.gz 并删除aa.txt
find . -name "aa.txt" -type f -exec tar -zcvf {}.tar.gz {} \; -exec rm -rf {} \; > /dev/null