linux find 使用说明


find 按文件修改时间查找文件

find中搭配atime、ctime和mtime:
atime:访问时间(access time),指的是文件最后被读取的时间,可以使用touch命令更改为当前时间;
ctime:变更时间(change time),指的是文件本身最后被变更的时间,变更动作可以使chmod、chgrp、mv等等;
mtime:修改时间(modify time),指的是文件内容最后被修改的时间,修改动作可以使echo重定向、vi等等;

 以下例子应该很容易理解上述三个时间:某用户在2018年1月5日00:00:00时,在/home下输入ping www.baidu.com > ping.log;
 5秒钟后,该用户使用ctrl+C强制关闭该命令;
 5秒钟后,使用cat ping.log查看。则ping.log的:
 ctime为2018-01-05 00:00:00
 mtime为2018-01-05 00:00:05
 atime为2018-01-05 00:00:10。

find . -mtime N
N * 24
+1 表示: 1 * 24 + 24 小时以外
+0 表示: 0 * 24 + 24 小时以外
 1 表示: 1 * 24 + 24 到 24 之间
 0 表示: 0 * 24 + 24 到 0 之间
-1 表示: 0 * 24 + 24 内,甚至为未来时间

image

 find /data/www/fg/logs -type f -mtime +0 |xargs rm -rvf;
 find /data/www/fg/platform/backend/phpScript/log -type f -mtime +0 |xargs rm -rvf;
 find /home/test-php-1/data/www/manage/backend/phpScript/log/SwooleWorkLog -type f -mtime +0 |xargs rm -rvf;
---(+n)----------|----------(n)----------|----------(-n)---
(n+1)*24H前      | (n+1)*24H~n*24H间     |n*24H内

-ctime -n 查找距现在 n*24H 内修改过的文件
-ctime n 查找距现在 n*24H 前, (n+1)*24H 内修改过的文件
-ctime +n 查找距现在 (n+1)*24H 前修改过的文件

[a|c|m]min [最后访问|最后状态修改|最后内容修改]min
[a|c|m]time [最后访问|最后状态修改|最后内容修改]time


linux 文件的几种时间 (以 find 为例):
atime 最后一次访问时间, 如 ls, more 等, 但 chmod, chown, ls, stat 等不会修改些时间, 使用 ls -utl 可以按此时间顺序查看;
ctime 最后一次状态修改时间, 如 chmod, chown 等状态时间改变但修改时间不会改变, 使用 stat file 可以查看;
mtime 最后一次内容修改时间, 如 vi 保存后等, 修改时间发生改变的话, atime 和 ctime 也相应跟着发生改变.

注意: linux 里是不会记录文件的创建时间的, 除非这个文件自创建以来没有发生改变, 那么它的创建时间就是它的最后一次修改时间.
#ls -lt ./ 按修改时间顺序查看
#ls -lut ./ 按访问时间顺序查看
(如果想反序查看的话需要加一个选项 -r)
1. 以感兴趣的时间点创建一个文件
$ touch -t 1201050800.00 /tmp/cmp.test
2. 到数据目录用我们的瑞士军刀查找之
$ find . -newer /tmp/cmp.test -print
上面的命令会把目录也算在内,如果只关心文件变化,则可以如下:
$find . -type f -newer /tmp/cmp.test -print

Find的用法

find命令将所有匹配到的文件一起传递给exec执行,而xargs命令每次只获取一部分文件而不是全部,所以exec有长度限制,文件不能太多,否则会产生溢出错误,而xargs则没有。

find . -mtime -1 –print 跟现在小于1天修改的文件
find . -perm 755 –print 显示具有755属性的文件
find . -size +1000000c –print 查找大于1M的文件
find . -type f -exec ls -l {} \\; 查找文件并列表显示(注:{}与\\之间有空格,最后有;)
find . -type f -exec rm {} \\;查找文件并删除
find . -type f -print |xargs ls –l查看文件并列表显示
find / ( -perm -4000 -o -perm -2000 ) -type f –print 查找SUID和SGID文件
find /opt/svn/projects/ -maxdepth 1 只在当前目录层查找
find /opt/svn/projects/ -mindepth 1 -maxdepth 1 只在当前目录层下查找(不显示本身的层)

查找文件并且搜索内容(grep 显示文件名)

find . -name "*.txt" -exec grep -H hello {} \\;
find . -name "*.txt" |xargs -i grep -H hello {}
find . -name "*.txt" -exec grep -l hello {} \\;