OSX 命令 find -type f -exec file {} \: 不工作

Ben*_*ann 3 macos bash find

我正在尝试编写更改没有 DOS 行结尾的文件的脚本,以将它们更改为具有 DOS 行结尾,但是我对如何定位不包含 DOS 行结尾的文件感到困惑。

我有以下适用于 linux 的命令

$ find -type f -exec file {} \; | grep -v CRLF 
Run Code Online (Sandbox Code Playgroud)

它工作并返回

./test/test.bat: ASCII text
Run Code Online (Sandbox Code Playgroud)

但是,在 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]
Run Code Online (Sandbox Code Playgroud)

我也试过

$ 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
Run Code Online (Sandbox Code Playgroud)

是否应该在 OSX 上与 find 一起使用不同的语法来完成此操作?

Cha*_*ffy 7

findMacOS X 上使用的 BSD需要在表达式之前提供路径(您-type f是该表达式的一部分);因此它的使用消息放在path之外[brackets],这表明某些东西是可选的。


使用--以防止文件名被视为选项,并明确通过.为搜索的位置。

find . -type f -exec file -- '{}' + | grep -v CRLF
Run Code Online (Sandbox Code Playgroud)

...已在 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
' _ {} +
Run Code Online (Sandbox Code Playgroud)