Windows 查找:`-execdir';缺少参数;

Windows 查找:`-execdir';缺少参数;,windows,bash,shell,git-bash,Windows,Bash,Shell,Git Bash,我和git bash一起在win 10中工作。我有一大组文件,它们都没有扩展名。然而,我意识到“File”类型的文件是html文件。要选择这些,我已显示: $ find -not -name '*.*' 现在我需要重命名所有这些文件以添加.html扩展名(它们目前没有扩展名)。我试过: $ find -not -name '*.*' -execdir mv {} {}.html find: missing argument to `-execdir' 如何重命名这些文件?您缺少一个--传递的

我和git bash一起在win 10中工作。我有一大组文件,它们都没有扩展名。然而,我意识到“File”类型的文件是html文件。要选择这些,我已显示:

$ find -not -name '*.*'
现在我需要重命名所有这些文件以添加.html扩展名(它们目前没有扩展名)。我试过:

$ find -not -name '*.*' -execdir mv {} {}.html
find: missing argument to `-execdir'

如何重命名这些文件?

您缺少一个
--传递的文字分号,表示作为
-exec
操作一部分解析的参数的结束。接受这样的终止符可以让
find
接受
-exec
之后的其他操作,否则该系列中的任何操作都需要是命令行上的最后一个参数

find -not -name '*.*' -execdir mv -- '{}' '{}.html' ';'

也就是说,请注意,上述方法根本不能保证有效(或者不能用于以破折号开头的名称)。更便于携带的是:

find . -not -name '*.*' -exec sh -c 'for arg do mv -- "$arg" "$arg.html"; done' _ {} +
注意这些变化:

  • 指定开始搜索的目录的
    在POSIX标准
    find
    中是必需的;把它放在GNU平台上的能力是不可移植的扩展
  • 运行显式shell意味着不需要支持
    {}.html
    ,因此可以使用任何兼容的
    find
  • --
    确保以下参数被解析为文本文件名,而不是
    mv
    的选项,即使它们以破折号开头
  • 在上面的例子中,显式的
    \
    变为shell的
    $0
    ,因此后面的参数变为
    $1
    并向前——也就是说,数组也称为
    “$@”
    ,默认情况下,
    for
    迭代

    • +
      是必须的。还要注意的是,POSIX标准根本不能保证
      {}.html
      能够正常工作
      {}
      只被授权作为一个单独的单词,而不是子字符串,因此子字符串的大小写可能有效,也可能无效,这取决于您的实现。如果他在Windows上这样做,POSIX实际上并不相关,它几乎肯定是GNU find。谢谢,它确实有效,但我注意到目录也被重命名为具有.html扩展名。有没有办法避免这种情况?输入
      -type f
      以筛选文件,或输入
      -not-type d
      以仅排除目录。