find命令与实践
时间:2017-08-14 09:42 来源:潇湘夜雨 作者:华嵩阳 点击:次
介绍:find命令在目录结构中搜索文件,并执行指定的操作。Linux下find命令提供了相当多的
查找条件,功能很强大。由于find具有强大的功能,所以它的选项也很多,其中大部分选项都
值得我们花时间来了解一下。即使系统中含有网络文件系统( NFS),find命令在该文件系统中
同样有效,只你具有相应的权限。 在运行一个非常消耗资源的find命令时,很多人都倾向于把
它放在后台执行,以免前台等待时间太长。find命令可以用来查找某一时间范围内的文件,还
可以和其它命令结合来达到定期清理文件的目的。
1.命令格式:
find pathname -options [-print -exec -ok ...]
2.命令功能:
用于在文件树种查找文件,并作出相应的处理
3.命令参数:
pathname: find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。
-print: find命令将匹配的文件输出到标准输出。
-exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' { } \;,注意{ }和\;之间的空格。
-ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给
出提示,让用户来确定是否执行。
4.命令选项:
-name 按照文件名查找文件。
-perm 按照文件权限来查找文件。
-prune 使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略。
-user 按照文件属主来查找文件。
-group 按照文件所属的组来查找文件。
-mtime -n +n 按照文件的更改时间来查找文件, - n表示文件更改时间距现在n天以内,+ n表示文件更改时间距现在n天以前。
find命令还有-atime和-ctime 选项,但它们都和-m time选项。
-nogroup 查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。
-nouser 查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。
-newer file1 ! file2 查找更改时间比文件file1新但比文件file2旧的文件。
-type 查找某一类型的文件,诸如:
b - 块设备文件。
d - 目录。
c - 字符设备文件。
p - 管道文件。
l - 符号链接文件。
f - 普通文件。
-size n:[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。-depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
-fstype:查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件/etc/fstab中找到,该配置文件中包含了本系统中有关文件系统的信息。
-mount:在查找文件时不跨越文件系统mount点。
-follow:如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。
-cpio:对匹配的文件使用cpio命令,将这些文件备份到磁带设备中。
另外,下面三个的区别:
-amin n 查找系统中最后N分钟访问的文件
-atime n 查找系统中最后n*24小时访问的文件
-cmin n 查找系统中最后N分钟被改变文件状态的文件
-ctime n 查找系统中最后n*24小时被改变文件状态的文件
-mmin n 查找系统中最后N分钟被改变文件数据的文件
-mtime n 查找系统中最后n*24小时被改变文件数据的文件
5.使用实例
1>查找并删除
[root@hadoop-master find]# ls -l
总用量 476
-rw------- 1 root root 93268 11月 27 14:46 messages-20161106
-rw------- 1 root root 97822 11月 27 14:46 messages-20161113
-rw------- 1 root root 101075 11月 27 14:46 messages-20161120
-rw------- 1 root root 189010 11月 27 14:46 messages-20161127
[root@hadoop-master find]# touch -d "1/10/2016" messages-20161106 #更改文件的日期
[root@hadoop-master find]# ls -l
总用量 476
-rw------- 1 root root 93268 1月 10 2016 messages-20161106
-rw------- 1 root root 97822 11月 27 14:46 messages-20161113
-rw------- 1 root root 101075 11月 27 14:46 messages-20161120
-rw------- 1 root root 189010 11月 27 14:46 messages-20161127
[root@hadoop-master find]# find ./ -mtime +30 #查找当前目录30天以前的文件
./messages-20161106
[root@hadoop-master find]# find ./ -mtime +30 -exec rm -rf {} \; #删除30天以前的文件
[root@hadoop-master find]# ls -l
总用量 384
-rw------- 1 root root 97822 11月 27 14:46 messages-20161113
-rw------- 1 root root 101075 11月 27 14:46 messages-20161120
-rw------- 1 root root 189010 11月 27 14:46 messages-20161127
2>时间段的界限
[root@hadoop-master log]# date #当前时间
2016年 11月 27日 星期日 15:27:18 CST
[root@hadoop-master log]# find ./ -name 'messages*' -mtime +7 #查看当前目录中messages开头的7天前的文件
./messages-20161106
./messages-20161113
注意:不包括第七天的文件
[root@hadoop-master log]# find ./ -name 'messages*' -mtime 7 #查看当前目录中messages开头的第7天的文件
./messages-20161120
[root@hadoop-master log]# find ./ -name 'messages*' -mtime -7 #查看当前目录中messages开头的7天内的文件
./find/messages-20161127
./find/messages-20161120
./find/messages-20161113
./messages
./messages-20161127
注意:包括第七天的文件
3>一次查找多个文件名
[yanfa@test MCarrierPigeonServer]$ find /data/cxx/app/MCarrierPigeonServer -type d -name "bin" -o -name "config"
/data/cxx/app/MCarrierPigeonServer/config
/data/cxx/app/MCarrierPigeonServer/bin
发现三个文件名与
# find . -type f \( -name "*.sh" -o -name "*.txt" -o -name "*.c" \)
6、常见错误
有时候在使用find删除目录时会出现如下错误: find /data/backup/zookeeper/ -maxdepth 1 -type d -mtime +7 -name 'conf-*' -exec rm -rf {} \;
find: `/data/backup/zookeeper/conf-2017-05-15-23': No such file or directory
原因:没有指定find的目录深度,删除子目录是就已经删除了主目录,再删除就会报错。
解决方法:指定目录深度为1 find /data/backup/zookeeper/ -maxdepth 1 -type d -mtime +7 -name 'conf-*' -exec rm -rf {} \; (责任编辑:liangzh) |