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

3

我想编写脚本,将没有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上使用不同的语法来完成这个任务的方法?

OSX是基于BSD的,里面没有太多GNU的东西。OSX的find命令不同于GNU的find命令,并且具有不同的命令行选项。 - Marc B
这里唯一明显的非POSIX主义是省略了“路径”并依赖于使用“.”作为默认值。 - Charles Duffy
这与当前目录中的文件有关,而不是实际命令。我认为错误消息来自于“file”,好像“{}”被替换为“”。 - chepner
@chepner,同意。那个特定的序列似乎不太可能,但文件名中的其他非可打印字符(或者后面跟着退格符等以渲染为空)是有可能的。虽然为什么它们会导致特定的错误有点令人惊讶——也许是因为它们是损坏的符号链接?我需要看一下 OS X 的 find 如何处理这种情况。 - Charles Duffy
1个回答

7
在 MacOS X 上使用的 BSD find 需要在表达式之前提供一个路径(你的 -type f 是表达式的一部分);因此,它的用法消息将 path 放在 [方括号] 外面,表示该项是可选的。
使用 -- 来防止文件名被视为选项,并显式地传递 . 作为要搜索的位置。
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
' _ {} +

请问您能解释一下末尾的_ {} +是什么意思吗? - Frak
_ 是一个占位符,用于 $0,以便后续参数变为 $1 等。-exec ... {} + 告诉 find 将尽可能多的匹配项放在单个命令行上,而 -exec ... {} ... \; 则对每个匹配项运行单独的命令(如果您的命令可以编写为将多个文件名传递给单个调用,则效率要低得多!);您会发现这两种使用 -exec 的可能方式在 find 的 man 页面中列出。 - Charles Duffy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接