find配合xargs的问题(--no-run-if-empty)

作者:sealinger 发布时间:August 21, 2011 分类:混口饭吃

过程重现:

1)假设目录下有如下几个文件

[ligb@localhost ligb]$ ll
total 0
-rw-rw-r--  1 ligb ligb 0 Aug 21 10:00 time1000
-rw-rw-r--  1 ligb ligb 0 Aug 21 12:00 time1200
-rw-rw-r--  1 ligb ligb 0 Aug 21 14:00 time1400
-rw-rw-r--  1 ligb ligb 0 Aug 21 16:00 time1600
[ligb@localhost ligb]$ 

[ligb@localhost ligb]$ date
Sun Aug 21 17:39:27 CST 2011
[ligb@localhost ligb]$ 

2)使用find命令查找修改时间为4个小时之前的

分别使用 -exec 和 xargs 来处理find的结果:

[ligb@localhost ligb]$ find . -type f -mmin +240 -exec ls -l {} \; 
-rw-rw-r--  1 ligb ligb 0 Aug 21 10:00 ./time1000
-rw-rw-r--  1 ligb ligb 0 Aug 21 12:00 ./time1200
[ligb@localhost ligb]$ 
[ligb@localhost ligb]$ find . -type f -mmin +240 |xargs ls -l     
-rw-rw-r--  1 ligb ligb 0 Aug 21 10:00 ./time1000
-rw-rw-r--  1 ligb ligb 0 Aug 21 12:00 ./time1200

恩,没有问题,很正常。

3)使用find命令查找修改时间为8个小时之前的

分别使用 -exec 和 xargs 来处理find的结果:

[ligb@localhost ligb]$ find . -type f -mmin +480 -exec ls -l {} \;
[ligb@localhost ligb]$ 
[ligb@localhost ligb]$ find . -type f -mmin +480 |xargs ls -l      
total 0
-rw-rw-r--  1 ligb ligb 0 Aug 21 10:00 time1000
-rw-rw-r--  1 ligb ligb 0 Aug 21 12:00 time1200
-rw-rw-r--  1 ligb ligb 0 Aug 21 14:00 time1400
-rw-rw-r--  1 ligb ligb 0 Aug 21 16:00 time1600
[ligb@localhost ligb]$

问题来了,-exec 的结果是对的,xargs 却列出了所有文件,这是怎么回事???

问题分析:

1)先看看xargs 是什么:

NAME
       xargs - build and execute command lines from standard input

恩。。跟我们想的一样。

2)但是上面例子说明,xargs 即使在前一个命令没有输出结果的时候,它也照样执行它后面的命令。

这就是问题所在了。。。

解决办法:为 xargs 加上参数 --no-run-if-empty

[ligb@localhost ligb]$ find . -type f -mmin +480 |xargs --no-run-if-empty ls -l 
[ligb@localhost ligb]$ 

恩,好了,很欣慰。

标签: none

添加新评论 »

captcha
请输入验证码