find命令与xargs命令用法实例教程详解

发布时间:2020-01-28编辑:脚本学堂
本文介绍了find命令与xargs命令的用法,二者结合实现强大的文件查找与相关操作,需要的朋友参考下。

find命令与xargs命令用法实例教程详解 第二部分
7、根据文件大小查找:
 

-size: 根据文件大小查找
-size [+|-]#Unit

例如:-size +2MB (+表示大于)
常用单位:k, M, G
文件查找的一个比较独特的地方,当我们以某个单位指定以后,只要在单位变化范围内1范围内的变化的都符合条件;
注意:
I.小于:
 

小于-1M:表示0M以下的所有文件是小于-1M的;
小于-2M:表示1M以下的所有文件是小于-2M的;
小于-3M:表示2M以下的所有文件是小于-3M的;
小于-4M:表示3M以下的所有文件是小于-4M的;
 

II.大于:
 

大于+1M:表示1M以上的所有文件是大于+1M的;
 

III.不加+-号
 

1M的表示:只要在单位变化范围内1M范围内的变化的都符合条件.

应用举例:
1).查找/var/log目录下的文件是在1M以内的显示出来:
 

[root@jbxue tmp]# find /var/log -size 1M
/var/log
/var/log/ConsoleKit
/var/log/ConsoleKit/history
...
/var/log/maillog-20140226
[root@jbxue tmp]#

2).查找/var/log目录下的文件是大于1M的显示出来:
 

[root@jbxue tmp]# find /var/log -size +1M
[root@jbxue tmp]# 没有查到

3).查找/var/log目录下的文件是小于1M的显示出来:
 

[root@jbxue tmp]# find /var/log -size -1M
/var/log/spice-vdagent.log
/var/log/tallylog
/var/log/spooler
/var/log/wpa_supplicant.log
/var/log/spooler-20140226
/var/log/maillog
[root@jbxue tmp]#

8.根据时间戳查找:
根据时间戳查找:
以天为单位(time):访问时间
 

-atime [+|-]#
+: 表示(#+1)天之外被访问过;
-: 表示#天之内被访问过;
无符号:表示短于(#+1)> x >=#天的时间段被访问过;
-mtime:修改时间
-ctime:创建时间

以分钟为单位(min):
 

-amin [+|-]#:访问时间
-mmin:修改时间
-cmin:创建时间

应用举例:
1)、查找/var/log目录下的最近一天内编辑过的文件:
 

[root@jbxue tmp]# find /var/log -atime -1
/var/log
/var/log/dmesg
/var/log/sa
/var/log/sa/sa26
/var/log/maillog
/var/log/messages
[root@jbxue tmp]#

2)、查找/var/log目录下刚好在一天内编辑过的文件:
 

[root@jbxue tmp]# find /var/log -atime 1
/var/log
/var/log/yum.log
/var/log/maillog-20140226
[root@jbxue tmp]#

3)、查找/var/log目录下刚好在一天之外编辑过的文件:
 

[root@jbxue tmp]# find /var/log -atime +1
/var/log/ConsoleKit/history
/var/log/audit/audit.log
/var/log/sa/sa09
/var/log/anaconda.storage.log
/var/log/maillog-20140226
[root@jbxue tmp]#

4)、在/home下查60分钟前改动过的文件find /home -mmin  +60
5)、查最近30分钟前被存取过的文件find /home -amin +30

9、根据权限查找:
根据权限查找:
-perm [+|-]MODE
MODE:精确匹配
+MODE: 任何一类用户的任何一位权限匹配;常用于查找某类用户的某特定权限是否存在;
-MODE: 每类用户的指定要检查的权限位都匹配;

linux命令大全之find命令应用举例:
1)、查找/var/log目录下权限为600的文件:
 

[root@jbxue tmp]# find /var/log -perm 600
/var/log/audit/audit.log
/var/log/spice-vdagent.log
/var/log/cron-20140226
/var/log/tallylog
/var/log/btmp
/var/log/cron
/var/log/spooler
/var/log/messages-20140226
/var/log/anaconda.log
/var/log/secure-20140226
/var/log/anaconda.yum.log
/var/log/secure
/var/log/spooler-20140226
/var/log/anaconda.syslog
/var/log/anaconda.program.log
/var/log/anaconda.ifcfg.log
/var/log/maillog
/var/log/anaconda.storage.log
/var/log/messages
/var/log/maillog-20140226
[root@jbxue tmp]#
[root@jbxue tmp]# ls -l /var/log -->可以看下的权限的

2)、查找/tmp目录下为写的权限的文件,创建文件并测试:
 

[root@jbxue tmp]# mkdir test
[root@jbxue tmp]# cd test/
[root@jbxue test]# touch hello.txt
[root@jbxue test]# ls
hello.txt
[root@jbxue test]# find ./ -perm +222
./
./hello.txt
[root@jbxue test]#

3)、查找/tmp目录下所有其他用户有写的权限的文件:
 

12 [root@jbxue test]# find ./ -perm 002
[root@jbxue test]# --> 没有

4)、查找/etc/init.d/目录下的其他用户有执行权限,且文件类型是普通文件的:
 

[root@jbxue test]# find /etc/init.d/ -type f -perm +001
/etc/init.d/rpcsvcgssd
/etc/init.d/sandbox
/etc/init.d/ntpd
...
/etc/init.d/netfs
/etc/init.d/autofs
[root@jbxue test]#

5)、查找/tmp/test/目录下至少有一类用户有写权限;
 

[root@jbxue test]# find ./ -perm -444
./
./hello.txt
[root@jbxue test]#

10、处理动作:
处理动作:
-print:打印在标准输出上;
-ls:以长格式输出各文件详细信息;
-exec COMMAND {} ; :对查找到的文件执行指定的命令;注意格式要正确:"-exec 命令 {} ;"
注意“{}” 与 ; 之间有空格
-ok COMMAND {} ; : 交互式的-exec;
{}表示占位符
find把查找到的所有文件一次性地传递给-exec所指定的命令
find | xargs COMMAND
在使用find命令的-exec选项处理匹配到的文件时,(www.jb200.com 脚本学堂) find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。
find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。
在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;
而使用xargs命令则只有一个进程。
另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。

应用举例:
1)、查找/tmp目录下其他用户有读权限或者有写权限的文件并显示其详细信息:
 

[root@jbxue ~]# find /tmp -perm -006 -ls
10485774 drwxrwxrwt  4 rootroot4096 Feb 26 21:35 /tmp
10492154 drwxrwxrwt  2 rootroot4096 Feb 26 15:44 /tmp/.ICE-unix
[root@jbxue ~]#

2)、查找所有用户都有执行权限,或者其他用户都有写和执行权限:
 

[root@jbxue ~]# chmod o+x /tmp/hello.txt -->给其他用户赋予执行权限
[root@jbxue ~]# find /tmp -perm -003 -ls
10485774 drwxrwxrwt  4 rootroot4096 Feb 26 23:07 /tmp
10492154 drwxrwxrwt  2 rootroot4096 Feb 26 15:44 /tmp/.ICE-unix
10522130 -rw-rw-rwx  1 Hadoop  hadoop  0 Feb 26 23:07 /tmp/hello.txt
[root@jbxue ~]#

3)、查找其他用户都有写和执行权限,并且类型为普通文件:
 

[root@jbxue ~]# find /tmp -perm -003 -type f -ls
10522130 -rw-rw-rwx  1 hadoop  hadoop  0 Feb 26 23:07 /tmp/hello.txt
[root@jbxue ~]#

4)、查找类型为普通文件,并且将查找出来的文件的用户的写、执行权限去掉:
 

[root@jbxue ~]# find /tmp -perm -003 -type f -exec chmod o-wx {} ;
[root@jbxue ~]# ls /tmp/hello.txt -l
-rw-rw-r-- 1 hadoop hadoop 0 Feb 26 23:07 /tmp/hello.txt
[root@jbxue ~]#

5)、查找类型为普通文件,并且将查找出来的文件强行删除,注意如果有目录也会一起都被删除掉的哦:
 

[root@jbxue ~]# find /tmp -perm -003 -type f -exec rm -rf {} ;

6)、查找类型为普通文件,并且将查找出来的文件的用户的写、执行权限去掉:
 

[root@jbxue tmp]# find /tmp -perm -003 -type f | xargs chmod o-wx
[root@jbxue tmp]# ll /tmp/hello.txt
-rw-rw-r-- 1 hadoop hadoop 0 Feb 26 23:07 /tmp/hello.txt
[root@jbxue tmp]#

7)、查找/tmp目录下以.doc结尾的文件并改成以.docx:
 

[root@localhost ~]# find /tmp -name "*.doc" -exec mv {} {}x ;
[root@jbxue ~]# ls /tmp/test/
hehe.docx  hello.txt
[root@jbxue ~]#
[root@jbxue ~]# ls /tmp/
fstab  hello.txt  inittab  test  word.docx
[root@jbxue ~]#

8)、把/opt/test/目录下所有含有"linux"字符的文件全部替换成windows:
命令如:
 

find /opt/test/ -type f | awk -F":" '{print $1}' |xargs sed -i's/linux/windows/g'


9). find /a -type f -exec|-ok rm -rf { } ;
10).find /a -type f -exec|-ok rm -rf { } +;
11).find /a -type f –print0 | xargs -0 rm ;

例子:
1、查找/var/目录属主为root且属组为mail的所有文件;
 

# find /var/ -user root -a -group mail

2、查找/usr目录下不属于root、bin或Hadoop的所用文件(两种方法);
 

# find /usr/ -not -user root -a -not -user bin -a -not -user hadoop
# find /usr/ -not ( -user root -o -user bin -o -user hadoop )

3、查找/etc/目录下最近一周内其内容修改过的,且不属于root或hadoop的文件(两种方法);
 

# find /etc/ -mtime -7 -a -not -user root -a -not -user hadoop
# find /etc/ -mtime -7 -a -not ( -user root -o -user hadoop )

4、查找当前系统上没有属主或属组,且最近1个月内曾被访问过的文件;
 

# find / ( -nouser -o -nogroup ) -a -atime -30

5、查找/etc/目录下大于1M且类型为普通文件的所有文件;
 

# find /etc/ -size +1M -a -type f

6、查找/etc/目录所有用户都没有写权限的文件;
 

# find /etc/ -not -perm +222


所有都没有:相反:任何一个有
所有都有:相反:至少有一个没有

7、查找/etc/目录下至少有一类用户没有写权限;
 

# find /etc/ -not -perm -222

8、查找/etc/init.d/目录下,所有用户都有执行权限且其它用户有写权限的文件;
 

# find /etc/init.d/  -perm -113

9、查找系统上的其他用户有执行权限,且文件类型是普通文件的:
 

# find / -type f -perm +001

以上就是linux下find命令与xargs命令的用法,算是非常全面了,建议大家好好研究下这二个命令,在以后的linux系统管理里与运维中会经常用到,且会在关键时刻帮你成就大业的!