【问题标题】:OSX command find -type f -exec file {} \: not workingOSX 命令 find -type f -exec file {} \: 不工作
【发布时间】:2017-01-27 15:10:33
【问题描述】:

我正在尝试编写脚本更改没有 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,并且有不同的命令行选项。
  • 这里唯一明显的非POSIX主义是省略path并使用.作为默认值。
  • 我认为这与当前目录中的文件有关,而不是与实际命令有关。错误消息来自file,好像{}"" 替换。
  • @chepner,同意。该特定顺序似乎不太可能,但文件名中的其他不可打印字符(或后跟退格键 &c. 以 render 为空的字符)是合理的。虽然他们为什么会导致那个特定的错误有点令人惊讶——也许如果他们的符号链接坏了?我需要看看 OS X 的 find 是如何处理这种情况的。

标签: bash macos find


【解决方案1】:

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


使用-- 防止文件名被视为选项,并明确传递. 作为搜索位置。

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
' _ {} +

【讨论】:

  • 你能解释一下_ {} +最后的含义吗?
  • _$0 的占位符,因此后续参数变为$1 及更高版本。 -exec ... {} + 告诉 find 在单个命令行上放置尽可能多的匹配项,而 -exec ... {} ... \; 每个匹配项运行一个单独的命令(如果您的命令可以编写为将多个文件名传递给一个调用!);您会在 find 的手册页中找到使用 -exec 的两种可能方式。
猜你喜欢
  • 1970-01-01
  • 2014-02-04
  • 1970-01-01
  • 1970-01-01
  • 2013-12-07
  • 1970-01-01
  • 2013-01-13
  • 1970-01-01
  • 2013-11-13
相关资源
最近更新 更多