【问题标题】:Shell script - find: missing argument to `-exec'Shell 脚本 - 查找:缺少 `-exec' 的参数
【发布时间】:2018-08-16 01:04:51
【问题描述】:

我正在尝试运行此脚本:

alias logs="cd L:/"
find $logs -name '*system.log*' -mtime +14 -exec rm {} \;

但是得到这个错误:find: missing argument to `-exec'。我已经尝试查看有关此的其他帖子,但无法使其正常工作。我正在使用 cygwin 在 Windows 上运行此脚本。

【问题讨论】:

标签: bash shell


【解决方案1】:

如果您创建了任何名称为 log 的别名,那么要使用它,您应该使用 $logs 而不是 logs

另外,您使用的查找可能是Windows 而不是Cygwin。如果您输入“which find”,这一点会很清楚

【讨论】:

  • 哎呀,谢谢你,因为我在试图找出错误时没有注意到。我更新了我的代码,因为我仍然遇到同样的错误。
  • 你是对的,这不是 Cygwin 的发现。谢谢您的回答。这解决了它!
  • alias 不是必需的。可能发生的事情是$logs(作为未定义变量的未引用扩展)正在消失,find 正在搜索当前工作目录。
  • 这个错误是由 UNIX 风格的find 发出的,所以我不相信 PATH 问题导致使用错误版本的说法。脚本更有可能具有 DOS 样式的换行符,因此最后一个参数以 ;$'\r' 出现,而​​不仅仅是 ;-exec 操作期望/需要作为其终止符。
  • @chepner, ...为什么find 搜索当前目录会导致 OP 报告的特定错误?
【解决方案2】:

首先,一些小修复:

#!/bin/sh
logs=/cygdrive/l
find "$logs" -name '*system.log*' -mtime +14 -exec rm -- {} +

...但是这些并不能解决您真正的问题(导致-exec 报告错误的问题),这几乎可以肯定是您的脚本中存在 DOS 换行符。

find -exec 在没有看到仅包含确切字符串 ; 的参数时报告有问题的错误。在引号之外,\; 应该是那个参数 - 但如果您的文件有隐藏字符,它可能会有所不同。并且 DOS 文本文件在由需要 UNIX 文本文件的程序打开时会显示为隐藏字符,因为这两种格式具有不同的行分隔符。

要解决此问题,请在 vim 等原生 UNIX 编辑器中打开文件,运行 :set fileformat=unix,然后保存;或使用dos2unix 就地转换。

【讨论】:

    猜你喜欢
    • 2012-01-30
    • 1970-01-01
    • 2011-02-27
    • 2014-04-05
    • 2020-04-11
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    • 2017-12-16
    相关资源
    最近更新 更多