Bash OSX命令find-type f-exec文件{}\:不工作
我正在尝试编写脚本来更改没有DOS行结尾的文件,以将它们更改为有DOS行结尾,但我不知道如何找到不包含DOS行结尾的文件 我有以下在linux上工作的命令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
$ 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
查找的两种可能方法。