Bash OSX命令find-type f-exec文件{}\:不工作

Bash OSX命令find-type f-exec文件{}\:不工作,bash,macos,find,Bash,Macos,Find,我正在尝试编写脚本来更改没有DOS行结尾的文件,以将它们更改为有DOS行结尾,但我不知道如何找到不包含DOS行结尾的文件 我有以下在linux上工作的命令 $ find -type f -exec file {} \; | grep -v CRLF 它工作并返回 ./test/test.bat: ASCII text 然而,在OSX上我得到了 $ find -type f -exec file {} \; | grep -v CRLF find: illegal option -- t u

我正在尝试编写脚本来更改没有DOS行结尾的文件,以将它们更改为有DOS行结尾,但我不知道如何找到不包含DOS行结尾的文件

我有以下在linux上工作的命令

$ find -type f -exec file {} \; | grep -v CRLF 
它工作并返回

./test/test.bat: ASCII text
然而,在OSX上我得到了

$ find -type f -exec file {} \; | grep -v CRLF
find: illegal option -- t
usage: find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]
       find [-H | -L | -P] [-EXdsx] -f path [path ...] [expression]
我也试过了

$ find . -type f -exec file {} \; | grep -v CRLF
cannot open `' (No such file or directory)
cannot open `' (No such file or directory)
cannot open `' (No such file or directory)
cannot open `' (No such file or directory)
... etc

OSX上的find是否应该使用不同的语法来实现这一点

MacOS X上使用的BSD
find
需要在表达式之前提供路径(您的
-type f
是该表达式的一部分);因此,它的用法消息将
路径
置于
[括号]
之外,这表明某些内容是可选的


使用
--
防止将文件名视为选项,并显式地将
传递为要搜索的位置

find . -type f -exec file -- '{}' + | grep -v CRLF
…已在MacOS 10.11.6上进行了明确测试


<> >为了更好地跟踪错误,请考虑以下内容:

find . -type f -exec bash -c '
  for result; do
    file "$result" 2>/dev/null || {
      printf "Unable to run file against %q\n" "$result"
    }
  done
' _ {} +

OSX基于bsd,没有太多GNU内容。osx find不是gnu find,它有不同的命令行选项。这里唯一明显的非位置主义是省略
路径
,并使用
作为默认值依赖它。我认为这更多地与当前目录中的文件有关,而不是与实际命令有关。错误消息来自
文件
,就好像
{}
替换了一样。这种特殊的顺序似乎不太可能,但文件名中的其他不可打印字符(或后跟空格的字符&c.表示为空)是合理的。虽然他们为什么会导致那个特定的错误有点令人惊讶——也许是因为他们的符号链接断了?我需要看看OSX的
find
是如何处理这个场景的。你能解释一下
{}+
在结尾是什么意思吗?
{/code>是
$0
的一个占位符,这样后面的参数就变成了
$1
和以后的参数<代码>-exec。。。{}+
告诉
find
在单个命令行中放置尽可能多的匹配项,而
-exec。。。{} ... \;
对每个匹配运行一个单独的命令(如果您的命令可以编写为将多个文件名传递给单个调用,那么效率会低得多!);您将在手册页中找到使用
-exec
查找
的两种可能方法。