Chinaunix

标题: find命令怪问题 [打印本页]

作者: html    时间: 2008-01-31 16:37
标题: find命令怪问题
环境:as4
把 find -exec cmd {} \;写到/usr/bin下的脚本中执行报错:
find: missing argument to `-exec'

但是把脚本中的内容粘贴到#下运行,又是可以的。

不知道哪位大侠能帮忙解答一下?
作者: FinalBSD    时间: 2008-01-31 16:41
cmd是啥呢
作者: waker    时间: 2008-01-31 16:44
估计是写的时候\没了
作者: html    时间: 2008-02-03 08:47
我现在把脚本里面的内容贴上来:
find /backupdb/ecard \-name '*.dmp' -atime +20 -exec rm -f {} \;

在#下可以运行,写入脚本执行就报错。
作者: 寂寞烈火    时间: 2008-02-04 00:55
原帖由 html 于 2008-2-3 08:47 发表
我现在把脚本里面的内容贴上来:
find /backupdb/ecard \-name '*.dmp' -atime +20 -exec rm -f {} \;

在#下可以运行,写入脚本执行就报错。

find的-name前不需要加 \
作者: html    时间: 2008-02-04 16:08
按楼上的意见进行了测试,结果是一样的。
作者: liang573728    时间: 2008-02-04 16:21
这样写看看
find /backupdb/ecard/  -name "*.dmp" -atime +20 -exec rm -f {} \;
作者: html    时间: 2008-02-05 09:18
把单引号换成双引号,对吗?
试了一下,还是一样报错:find: missing argument to `-exec'
作者: liang573728    时间: 2008-02-05 09:36
是不是你这个目录里面没有*.dmp的文件?
作者: html    时间: 2008-02-09 10:01
当然不是。
如果没有*.dmp文件,报错信息也不会是那样的。
作者: bzhao    时间: 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 {} \;
作者: html    时间: 2008-02-13 17:13


我是redhat as4 ,为什么我的环境里面不行?
郁闷!
作者: wilsonn    时间: 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.再多做几个其他的测试
作者: html    时间: 2008-02-14 10:38
测试一:没有看到有怪字符
测试二:不存在问题。
cat 脚本
复制
粘贴
执行 ok
直接执行脚本,报错。

还有什么测试可以做呢?
作者: wilsonn    时间: 2008-02-14 11:29
测试就是将你整条命令中可以替换的部分挨个替换一下,例如在其他目录,其他文件,不加通配符,不加atime,替换-exec为-print,find之前跟上路径:/usr/bin/find之类,查看用户的profile,检查环境变量env,看看到底哪里有问题,一步一步换一步一步慢慢查
还有你的脚本内容呢,第一行加#!/bin/ksh了吗
作者: wilsonn    时间: 2008-02-14 11:43
还有你确认你执行的脚本就是你编辑的脚本,请带上路径,例如:ksh ./test.sh
作者: html    时间: 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应该检查哪些内容?
作者: lgfang    时间: 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 编辑 ]
作者: html    时间: 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'
作者: lgfang    时间: 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 编辑 ]
作者: html    时间: 2008-02-16 11:22
shell确定是bash

测试
[root@localhost ~]#shell
bash: shell: command not find

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

执行
[root@localhost ~]#dof.sh
find: missing argument to 'exec'

不过现在问题解决了。办法是,重新写一个新的脚本,内容是一样的。
[root@localhost ~]# vi /usr/bin/findf.sh
[root@localhost ~]# cat /usr/bin/findf.sh
/usr/bin/find /backupdb/ecard -name '*.dmp' -atime +20 -exec /bin/rm -rf {} \;

执行,ok,没有再报错。
虽然很晕,但是只能认为,原脚本文件中有看不到的东西再做怪。
只能怪自己没有肉眼看见鬼的本事
作者: lgfang    时间: 2008-02-16 12:49
不过现在问题解决了。办法是,重新写一个新的脚本,内容是一样的。


晕,这个应该是一开始就尝试的!
作者: ZAROK    时间: 2008-02-17 11:12
原脚本中没有“看不见的东西”……linux是科学不是玄学……

你这样写不对,花括号也要加单引号的,下面的三种语句都可以解决你的问题:

方法1:
find /backupdb/ecard -name '*.dmp' -atime +20 -exec rm -f  '{}'  ';'
——你忘记你得到的输出了吗?“missing arguments”这里所说的arguments是那对花括号,它还没有被find程序识别成“查找得到的结果”,就被shell解释了。

方法2:
find /backupdb/ecard -name '*.dmp' -atime +20 | xargs rm -f

方法3:
rm -f `find /backupdb/ecard -name '*.dmp' -atime +20`
(注意这里是反引号不是单引号)
作者: lgfang    时间: 2008-02-17 19:07
find /backupdb/ecard -name '*.dmp' -atime +20 -exec rm -f  '{}'  ';'
——你忘记你得到的输出了吗?“missing arguments”这里所说的arguments是那对花括号,它还没有被find程序识别成“查找得到的结果”,就被shell解释了。


你是怎么得出这个结论的?你在哪个manual上看到 {} 和 ; 要用单引号?
作者: wilsonn    时间: 2008-02-18 10:52
不是文本里有什么看不见的东西; 怀疑你有两个dof.sh;
运行脚本要养成习惯带上路径(相对或者绝对路径都可以)
应该这样运行:#/usr/bin/dof.sh
1.检查一下当前用户的PATH变量
2.搜索一下是否有多个dof.sh脚本
作者: html    时间: 2008-02-20 15:23
谢谢楼上诸位,
{和;还要加引号,还是第一次听说,
zarok的脚本会去尝试,
多个dof.sh是不会有的。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2