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]$
恩,好了,很欣慰。