免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: html
打印 上一主题 下一主题

find命令怪问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-02-11 11:54 |只看该作者
I did test the below line in a shell file test.sh
it work.  my system is RH9

find ./  -name "*.dmp" -atime +20 -exec rm -f {} \;

论坛徽章:
0
12 [报告]
发表于 2008-02-13 17:13 |只看该作者


我是redhat as4 ,为什么我的环境里面不行?
郁闷!

论坛徽章:
0
13 [报告]
发表于 2008-02-13 17:18 |只看该作者
1.脚本语法没问题;
2.怀疑:脚本中很可能有不可见怪字符或者是目录下*.dmp中有怪字符文件
3.测试一:ls -ld  /backupdb/ecard/*.dmp >/tmp/q.txt; vi  /tmp/q.txt看看是否有异常文件或者子目录也叫*.dmp
4.测试二: 编辑脚本,内容直接拷贝如下语句,然后测试
  find  /backupdb/ecard  -name  "*.dmp"  -atime  +20  -exec  ls  -ld  {}  \;
5.再多做几个其他的测试

论坛徽章:
0
14 [报告]
发表于 2008-02-14 10:38 |只看该作者
测试一:没有看到有怪字符
测试二:不存在问题。
cat 脚本
复制
粘贴
执行 ok
直接执行脚本,报错。

还有什么测试可以做呢?

论坛徽章:
0
15 [报告]
发表于 2008-02-14 11:29 |只看该作者
测试就是将你整条命令中可以替换的部分挨个替换一下,例如在其他目录,其他文件,不加通配符,不加atime,替换-exec为-print,find之前跟上路径:/usr/bin/find之类,查看用户的profile,检查环境变量env,看看到底哪里有问题,一步一步换一步一步慢慢查
还有你的脚本内容呢,第一行加#!/bin/ksh了吗

论坛徽章:
0
16 [报告]
发表于 2008-02-14 11:43 |只看该作者
还有你确认你执行的脚本就是你编辑的脚本,请带上路径,例如:ksh ./test.sh

论坛徽章:
0
17 [报告]
发表于 2008-02-15 11:39 |只看该作者
测试如下:

ot@localhost ~]# cat /usr/bin/dof.sh
find /backupdb/ecard -name "*.dmp"

#find /backupdb/ecard -name "*.dmp"

# -atime +20
# -exec rm -f {} \;

执行脚本
[root@localhost ~]# dof.sh
直接键入命令
[root@localhost ~]# find /backupdb/ecard -name "*.dmp"

/backupdb/ecard/vip20080213.dmp
/backupdb/ecard/vip20080210.dmp
/backupdb/ecard/vip20080206.dmp
/backupdb/ecard/vip20080211.dmp
/backupdb/ecard/ecard20080215.dmp
/backupdb/ecard/vip20080125.dmp
/backupdb/ecard/ecard20080214.dmp
/backupdb/ecard/vip20080130.dmp
/backupdb/ecard/vip20080208.dmp
/backupdb/ecard/vip20080209.dmp
/backupdb/ecard/vip20080212.dmp
/backupdb/ecard/vip20080124.dmp
/backupdb/ecard/vip20080201.dmp
/backupdb/ecard/vip20080131.dmp
/backupdb/ecard/vip20080204.dmp
/backupdb/ecard/vip20080214.dmp
/backupdb/ecard/vip20080207.dmp
/backupdb/ecard/ecard20080202.dmp
/backupdb/ecard/vip20080123.dmp
/backupdb/ecard/vip20080128.dmp
/backupdb/ecard/vip20080203.dmp
/backupdb/ecard/vip20080129.dmp
/backupdb/ecard/vip20080202.dmp
/backupdb/ecard/vip20080127.dmp
/backupdb/ecard/vip20080126.dmp

表现是不一样的。

[root@localhost ~]# ls /backupdb/ecard
ecard20080202.dmp  vip20080127.dmp  vip20080203.dmp  vip20080211.dmp
ecard20080214.dmp  vip20080128.dmp  vip20080204.dmp  vip20080212.dmp
ecard20080215.dmp  vip20080129.dmp  vip20080206.dmp  vip20080213.dmp
vip20080123.dmp    vip20080130.dmp  vip20080207.dmp  vip20080214.dmp
vip20080124.dmp    vip20080131.dmp  vip20080208.dmp
vip20080125.dmp    vip20080201.dmp  vip20080209.dmp
vip20080126.dmp    vip20080202.dmp  vip20080210.dmp

修改脚本,换一种方式
[root@localhost ~]# vi /usr/bin/dof.sh
[root@localhost ~]# cat /usr/bin/dof.sh
find /backupdb/ecard -name "vip20080123.dmp" -print0|xargs -0 rm -rf

#find /backupdb/ecard -name "*.dmp"

# -atime +20

# -exec rm -f {} \;
执行脚本

[root@localhost ~]# dof

bash: dof: command not found

[root@localhost ~]# dof.sh

rm:无效选项 --

请尝试执行‘rm --help’来获取更多信息。

[root@localhost ~]# cat /usr/bin/dof.sh

find /backupdb/ecard -name "vip20080123.dmp" -print0|xargs -0 rm -rf

#find /backupdb/ecard -name "*.dmp"

# -atime +20

# -exec rm -f {} \;

直接键入命令
[root@localhost ~]# find /backupdb/ecard -name "vip20080123.dmp" -print0|xargs -0 rm -rf

[root@localhost ~]# ls /backupdb/ecard
ecard20080202.dmp  vip20080127.dmp  vip20080202.dmp  vip20080209.dmp
ecard20080214.dmp  vip20080128.dmp  vip20080203.dmp  vip20080210.dmp
ecard20080215.dmp  vip20080129.dmp  vip20080204.dmp  vip20080211.dmp
vip20080124.dmp    vip20080130.dmp  vip20080206.dmp  vip20080212.dmp
vip20080125.dmp    vip20080131.dmp  vip20080207.dmp  vip20080213.dmp
vip20080126.dmp    vip20080201.dmp  vip20080208.dmp  vip20080214.dmp

[root@localhost ~]#

文件被删除掉了。


楼上大侠,能不能说一下,profile和env应该检查哪些内容?

论坛徽章:
0
18 [报告]
发表于 2008-02-15 14:54 |只看该作者
1. find /backupdb/ecard \-name '*.dmp' -atime +20 -exec rm -f {} \;

把单引号改成双引号是错误的;
-name 前面不需要 \

2,把 crontab -l 贴上来,大家看看

3,你把 find、rm都用绝对路径指定再试试

[ 本帖最后由 lgfang 于 2008-2-15 14:56 编辑 ]

论坛徽章:
0
19 [报告]
发表于 2008-02-15 17:17 |只看该作者
[root@localhost ~]# vi /usr/bin/dof.sh
[root@localhost ~]# cat /usr/bin/dof.sh
find /backupdb/ecard -name '*.dmp' -atime +20 -exec rm -rf {} \;

执行脚本

[root@localhost ~]# dof.sh

find: missing argument to 'exec'

[root@localhost ~]# crontab -l
00 04 * * * dof.sh

rm后面加绝对路径
[root@localhost ~]# vi /usr/bin/dof.sh
[root@localhost ~]# cat /usr/bin/dof.sh
find /backupdb/ecard -name '*.dmp' -atime +20 -exec rm -rf  /backupdb/ecard {} \;

执行脚本

[root@localhost ~]# dof.sh

find: missing argument to 'exec'

论坛徽章:
0
20 [报告]
发表于 2008-02-15 19:43 |只看该作者

回复 #19 html 的帖子

1,我的意思是 find和rm 用绝对路径,例如

  1. /usr/bin/find /backupdb/ecard -name '*.dmp' -atime +20 -exec /bin/rm -rf {} \;
复制代码


2,在命令行直接运行和放到文件中运行,我能想到的不同之处是:有些在profile里设置的变量没有 export。

假设是 PATH 没有export会怎样?
有可能在命令行运行时用的 find 是一个版本,在shell脚本里或cron job里使用的find是另外一个版本。

不过即使是这样,也不太可能报 “find: missing argument to 'exec'” 呀?

几个问题:
你的shell是bash吧?
在脚步里和命令行分别都运行 which find rm 结果是什么?

[ 本帖最后由 lgfang 于 2008-2-15 19:46 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP